mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-02-23 21:38:15 +00:00
SQL: Fix issues with WEEK/ISO_WEEK/DATEDIFF (#49405)
Some extended testing with MS-SQL server and H2 (which agree on results) revealed bugs in the implementation of WEEK related extraction and diff functions. Non-iso WEEK seems to be broken since #48209 because of the replacement of Calendar and the change in the ISO rules. ISO_WEEK failed for some edge cases around the January 1st. DATE_DIFF was previously based on non-iso WEEK extraction which seems not to be the case. Fixes: #49376 (cherry picked from commit 54fe7f57289c46bb0905b1418f51a00e8c581560)
This commit is contained in:
parent
d9162c1243
commit
901a8d1dcc
@ -85,12 +85,12 @@ YEAR(CAST(birth_date AS DATE)) y,
|
|||||||
birth_date, last_name l FROM "test_emp" WHERE emp_no < 10010 ORDER BY emp_no;
|
birth_date, last_name l FROM "test_emp" WHERE emp_no < 10010 ORDER BY emp_no;
|
||||||
|
|
||||||
d:i | dm:i | dw:i | dy:i | iso_dw:i | w:i |iso_w:i | q:i | y:i | birth_date:ts | l:s
|
d:i | dm:i | dw:i | dy:i | iso_dw:i | w:i |iso_w:i | q:i | y:i | birth_date:ts | l:s
|
||||||
2 |2 |4 |245 |3 |36 |35 |3 |1953 |1953-09-02T00:00:00Z |Facello
|
2 |2 |4 |245 |3 |36 |36 |3 |1953 |1953-09-02T00:00:00Z |Facello
|
||||||
2 |2 |3 |154 |2 |23 |22 |2 |1964 |1964-06-02T00:00:00Z |Simmel
|
2 |2 |3 |154 |2 |23 |23 |2 |1964 |1964-06-02T00:00:00Z |Simmel
|
||||||
3 |3 |5 |337 |4 |49 |49 |4 |1959 |1959-12-03T00:00:00Z |Bamford
|
3 |3 |5 |337 |4 |49 |49 |4 |1959 |1959-12-03T00:00:00Z |Bamford
|
||||||
1 |1 |7 |121 |6 |18 |18 |2 |1954 |1954-05-01T00:00:00Z |Koblick
|
1 |1 |7 |121 |6 |18 |17 |2 |1954 |1954-05-01T00:00:00Z |Koblick
|
||||||
21 |21 |6 |21 |5 |4 |3 |1 |1955 |1955-01-21T00:00:00Z |Maliniak
|
21 |21 |6 |21 |5 |4 |3 |1 |1955 |1955-01-21T00:00:00Z |Maliniak
|
||||||
20 |20 |2 |110 |1 |17 |16 |2 |1953 |1953-04-20T00:00:00Z |Preusig
|
20 |20 |2 |110 |1 |17 |17 |2 |1953 |1953-04-20T00:00:00Z |Preusig
|
||||||
23 |23 |5 |143 |4 |21 |21 |2 |1957 |1957-05-23T00:00:00Z |Zielinski
|
23 |23 |5 |143 |4 |21 |21 |2 |1957 |1957-05-23T00:00:00Z |Zielinski
|
||||||
19 |19 |4 |50 |3 |8 |8 |1 |1958 |1958-02-19T00:00:00Z |Kalloufi
|
19 |19 |4 |50 |3 |8 |8 |1 |1958 |1958-02-19T00:00:00Z |Kalloufi
|
||||||
19 |19 |7 |110 |6 |16 |16 |2 |1952 |1952-04-19T00:00:00Z |Peac
|
19 |19 |7 |110 |6 |16 |16 |2 |1952 |1952-04-19T00:00:00Z |Peac
|
||||||
|
@ -313,7 +313,7 @@ SELECT birth_date, MAX(hire_date) - INTERVAL 1 YEAR AS f FROM test_emp GROUP BY
|
|||||||
;
|
;
|
||||||
|
|
||||||
monthOfDatePlusInterval_And_GroupBy
|
monthOfDatePlusInterval_And_GroupBy
|
||||||
SELECT WEEK_OF_YEAR(birth_date + INTERVAL 25 YEAR) x, COUNT(*) c FROM test_emp GROUP BY x HAVING c >= 3 ORDER BY c DESC;
|
SELECT WEEK_OF_YEAR(birth_date + INTERVAL 25 YEAR) x, COUNT(*) c FROM test_emp GROUP BY x HAVING c >= 3 ORDER BY c DESC, x ASC;
|
||||||
|
|
||||||
x:i | c:l
|
x:i | c:l
|
||||||
---------------+---------------
|
---------------+---------------
|
||||||
@ -324,8 +324,7 @@ null |10
|
|||||||
30 |4
|
30 |4
|
||||||
40 |4
|
40 |4
|
||||||
45 |4
|
45 |4
|
||||||
1 |3
|
8 |3
|
||||||
8 |3
|
|
||||||
21 |3
|
21 |3
|
||||||
28 |3
|
28 |3
|
||||||
32 |3
|
32 |3
|
||||||
|
@ -110,6 +110,15 @@ SELECT WEEK(birth_date) week, birth_date FROM test_emp ORDER BY WEEK(birth_date)
|
|||||||
44 |1961-11-02T00:00:00.000Z
|
44 |1961-11-02T00:00:00.000Z
|
||||||
;
|
;
|
||||||
|
|
||||||
|
weekOfYearVsIsoWeekOfYearEdgeCases
|
||||||
|
SELECT ISO_WEEK_OF_YEAR('2005-01-01T00:00:00.000Z'::datetime) AS "isow2005", WEEK('2005-01-01T00:00:00.000Z'::datetime) AS "w2005",
|
||||||
|
ISO_WEEK_OF_YEAR('2007-12-31T00:00:00.000Z'::datetime) AS "isow2007", WEEK('2007-12-31T00:00:00.000Z'::datetime) AS "w2007";
|
||||||
|
|
||||||
|
isow2005 | w2005 | isow2007 | w2007
|
||||||
|
---------------+---------------+---------------+---------------
|
||||||
|
53 |1 |1 |53
|
||||||
|
;
|
||||||
|
|
||||||
weekOfYearWithFilter
|
weekOfYearWithFilter
|
||||||
SELECT WEEK(birth_date) week, birth_date FROM test_emp WHERE WEEK(birth_date) > 50 OR WEEK(birth_date) < 4 ORDER BY WEEK(birth_date) DESC, birth_date DESC;
|
SELECT WEEK(birth_date) week, birth_date FROM test_emp WHERE WEEK(birth_date) > 50 OR WEEK(birth_date) < 4 ORDER BY WEEK(birth_date) DESC, birth_date DESC;
|
||||||
|
|
||||||
@ -319,7 +328,7 @@ DATEDIFF('milliseconds', '2019-09-04'::date, '2019-09-06'::date) as diff_millis,
|
|||||||
|
|
||||||
diff_year | diff_quarter | diff_month | diff_week | diff_day | diff_hours | diff_min | diff_sec | diff_millis | diff_mcsec | diff_nsec
|
diff_year | diff_quarter | diff_month | diff_week | diff_day | diff_hours | diff_min | diff_sec | diff_millis | diff_mcsec | diff_nsec
|
||||||
-----------+--------------+------------+-----------+----------+------------+----------+-----------+-------------+------------+----------
|
-----------+--------------+------------+-----------+----------+------------+----------+-----------+-------------+------------+----------
|
||||||
9 | -91 | 269 | -611 | 11683 | -64248 | 1676160 | -14083200 | 172800000 | 0 | 0
|
9 | -91 | 269 | -610 | 11683 | -64248 | 1676160 | -14083200 | 172800000 | 0 | 0
|
||||||
;
|
;
|
||||||
|
|
||||||
selectDateDiffWithField
|
selectDateDiffWithField
|
||||||
@ -331,13 +340,13 @@ FROM test_emp WHERE emp_no >= 10032 AND emp_no <= 10042 ORDER BY 1;
|
|||||||
|
|
||||||
emp_no | birth_date | hire_date | diff_year | diff_quarter | diff_month | diff_week | diff_day | diff_min | diff_sec
|
emp_no | birth_date | hire_date | diff_year | diff_quarter | diff_month | diff_week | diff_day | diff_min | diff_sec
|
||||||
---------+--------------------------+--------------------------+------------+--------------+------------+-----------+----------+-----------+----------
|
---------+--------------------------+--------------------------+------------+--------------+------------+-----------+----------+-----------+----------
|
||||||
10032 | 1960-08-09 00:00:00.000Z | 1990-06-20 00:00:00.000Z | 30 | -119 | 358 | -1559 | 10907 | -15706080 | 942364800
|
10032 | 1960-08-09 00:00:00.000Z | 1990-06-20 00:00:00.000Z | 30 | -119 | 358 | -1558 | 10907 | -15706080 | 942364800
|
||||||
10033 | 1956-11-14 00:00:00.000Z | 1987-03-18 00:00:00.000Z | 31 | -121 | 364 | -1584 | 11081 | -15956640 | 957398400
|
10033 | 1956-11-14 00:00:00.000Z | 1987-03-18 00:00:00.000Z | 31 | -121 | 364 | -1583 | 11081 | -15956640 | 957398400
|
||||||
10034 | 1962-12-29 00:00:00.000Z | 1988-09-21 00:00:00.000Z | 26 | -103 | 309 | -1343 | 9398 | -13533120 | 811987200
|
10034 | 1962-12-29 00:00:00.000Z | 1988-09-21 00:00:00.000Z | 26 | -103 | 309 | -1343 | 9398 | -13533120 | 811987200
|
||||||
10035 | 1953-02-08 00:00:00.000Z | 1988-09-05 00:00:00.000Z | 35 | -142 | 427 | -1857 | 12993 | -18709920 | 1122595200
|
10035 | 1953-02-08 00:00:00.000Z | 1988-09-05 00:00:00.000Z | 35 | -142 | 427 | -1856 | 12993 | -18709920 | 1122595200
|
||||||
10036 | 1959-08-10 00:00:00.000Z | 1992-01-03 00:00:00.000Z | 33 | -130 | 389 | -1691 | 11834 | -17040960 | 1022457600
|
10036 | 1959-08-10 00:00:00.000Z | 1992-01-03 00:00:00.000Z | 33 | -130 | 389 | -1690 | 11834 | -17040960 | 1022457600
|
||||||
10037 | 1963-07-22 00:00:00.000Z | 1990-12-05 00:00:00.000Z | 27 | -109 | 329 | -1429 | 9998 | -14397120 | 863827200
|
10037 | 1963-07-22 00:00:00.000Z | 1990-12-05 00:00:00.000Z | 27 | -109 | 329 | -1428 | 9998 | -14397120 | 863827200
|
||||||
10038 | 1960-07-20 00:00:00.000Z | 1989-09-20 00:00:00.000Z | 29 | -116 | 350 | -1523 | 10654 | -15341760 | 920505600
|
10038 | 1960-07-20 00:00:00.000Z | 1989-09-20 00:00:00.000Z | 29 | -116 | 350 | -1522 | 10654 | -15341760 | 920505600
|
||||||
10039 | 1959-10-01 00:00:00.000Z | 1988-01-19 00:00:00.000Z | 29 | -113 | 339 | -1477 | 10337 | -14885280 | 893116800
|
10039 | 1959-10-01 00:00:00.000Z | 1988-01-19 00:00:00.000Z | 29 | -113 | 339 | -1477 | 10337 | -14885280 | 893116800
|
||||||
10040 | null | 1993-02-14 00:00:00.000Z | null | null | null | null | null | null | null
|
10040 | null | 1993-02-14 00:00:00.000Z | null | null | null | null | null | null | null
|
||||||
10041 | null | 1989-11-12 00:00:00.000Z | null | null | null | null | null | null | null
|
10041 | null | 1989-11-12 00:00:00.000Z | null | null | null | null | null | null | null
|
||||||
@ -451,8 +460,8 @@ SELECT count(*) as count, DATE_DIFF('weeks', birth_date, hire_date) diff FROM te
|
|||||||
count | diff
|
count | diff
|
||||||
---------+------
|
---------+------
|
||||||
10 | null
|
10 | null
|
||||||
1 | 1121
|
1 | 1120
|
||||||
1 | 1124
|
1 | 1123
|
||||||
1 | 1168
|
1 | 1168
|
||||||
1 | 1196
|
1 | 1196
|
||||||
;
|
;
|
||||||
|
@ -27,7 +27,8 @@ import java.util.function.BiFunction;
|
|||||||
import static org.elasticsearch.common.logging.LoggerMessageFormat.format;
|
import static org.elasticsearch.common.logging.LoggerMessageFormat.format;
|
||||||
import static org.elasticsearch.xpack.sql.expression.TypeResolutions.isDate;
|
import static org.elasticsearch.xpack.sql.expression.TypeResolutions.isDate;
|
||||||
import static org.elasticsearch.xpack.sql.expression.TypeResolutions.isString;
|
import static org.elasticsearch.xpack.sql.expression.TypeResolutions.isString;
|
||||||
import static org.elasticsearch.xpack.sql.expression.function.scalar.datetime.NonIsoDateTimeProcessor.NonIsoDateTimeExtractor;
|
import static org.elasticsearch.xpack.sql.util.DateUtils.DAY_IN_MILLIS;
|
||||||
|
import static org.elasticsearch.xpack.sql.util.DateUtils.UTC;
|
||||||
|
|
||||||
public class DateDiff extends ThreeArgsDateTimeFunction {
|
public class DateDiff extends ThreeArgsDateTimeFunction {
|
||||||
|
|
||||||
@ -41,15 +42,11 @@ public class DateDiff extends ThreeArgsDateTimeFunction {
|
|||||||
DAYOFYEAR((start, end) -> safeInt(diffInDays(start, end)), "dy", "y"),
|
DAYOFYEAR((start, end) -> safeInt(diffInDays(start, end)), "dy", "y"),
|
||||||
DAY(DAYOFYEAR::diff, "days", "dd", "d"),
|
DAY(DAYOFYEAR::diff, "days", "dd", "d"),
|
||||||
WEEK((start, end) -> {
|
WEEK((start, end) -> {
|
||||||
int extraWeek = NonIsoDateTimeExtractor.WEEK_OF_YEAR.extract(end) -
|
long startInDays = start.toInstant().toEpochMilli() / DAY_IN_MILLIS -
|
||||||
NonIsoDateTimeExtractor.WEEK_OF_YEAR.extract(start) == 0 ? 0 : 1;
|
DatePart.Part.WEEKDAY.extract(start.withZoneSameInstant(UTC));
|
||||||
long diffWeeks = diffInDays(start, end) / 7;
|
long endInDays = end.toInstant().toEpochMilli() / DAY_IN_MILLIS -
|
||||||
if (diffWeeks < 0) {
|
DatePart.Part.WEEKDAY.extract(end.withZoneSameInstant(UTC));
|
||||||
diffWeeks -= extraWeek;
|
return safeInt((endInDays - startInDays) / 7);
|
||||||
} else {
|
|
||||||
diffWeeks += extraWeek;
|
|
||||||
}
|
|
||||||
return safeInt(diffWeeks);
|
|
||||||
}, "weeks", "wk", "ww"),
|
}, "weeks", "wk", "ww"),
|
||||||
WEEKDAY(DAYOFYEAR::diff, "weekdays", "dw"),
|
WEEKDAY(DAYOFYEAR::diff, "weekdays", "dw"),
|
||||||
HOUR((start, end) -> safeInt(diffInHours(start, end)), "hours", "hh"),
|
HOUR((start, end) -> safeInt(diffInHours(start, end)), "hours", "hh"),
|
||||||
|
@ -13,6 +13,7 @@ import java.time.OffsetTime;
|
|||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
import java.time.temporal.ChronoField;
|
import java.time.temporal.ChronoField;
|
||||||
|
import java.time.temporal.WeekFields;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
public class DateTimeProcessor extends BaseDateTimeProcessor {
|
public class DateTimeProcessor extends BaseDateTimeProcessor {
|
||||||
@ -36,7 +37,11 @@ public class DateTimeProcessor extends BaseDateTimeProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int extract(ZonedDateTime dt) {
|
public int extract(ZonedDateTime dt) {
|
||||||
return dt.get(field);
|
if (field == ChronoField.ALIGNED_WEEK_OF_YEAR) {
|
||||||
|
return dt.get(WeekFields.ISO.weekOfWeekBasedYear());
|
||||||
|
} else {
|
||||||
|
return dt.get(field);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int extract(OffsetTime time) {
|
public int extract(OffsetTime time) {
|
||||||
|
@ -10,7 +10,6 @@ import org.elasticsearch.common.io.stream.StreamInput;
|
|||||||
import org.elasticsearch.common.io.stream.StreamOutput;
|
import org.elasticsearch.common.io.stream.StreamOutput;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.time.DayOfWeek;
|
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
import java.time.temporal.ChronoField;
|
import java.time.temporal.ChronoField;
|
||||||
@ -28,7 +27,7 @@ public class NonIsoDateTimeProcessor extends BaseDateTimeProcessor {
|
|||||||
return dayOfWeek == 8 ? 1 : dayOfWeek;
|
return dayOfWeek == 8 ? 1 : dayOfWeek;
|
||||||
}),
|
}),
|
||||||
WEEK_OF_YEAR(zdt -> {
|
WEEK_OF_YEAR(zdt -> {
|
||||||
return zdt.get(WeekFields.of(DayOfWeek.SUNDAY, 1).weekOfWeekBasedYear());
|
return zdt.get(WeekFields.SUNDAY_START.weekOfYear());
|
||||||
});
|
});
|
||||||
|
|
||||||
private final Function<ZonedDateTime, Integer> apply;
|
private final Function<ZonedDateTime, Integer> apply;
|
||||||
|
@ -274,6 +274,17 @@ public class DateDiffProcessorTests extends AbstractSqlWireSerializingTestCase<D
|
|||||||
assertEquals(-350, new DateDiff(Source.EMPTY, l("ww"), dt2, dt1, zoneId)
|
assertEquals(-350, new DateDiff(Source.EMPTY, l("ww"), dt2, dt1, zoneId)
|
||||||
.makePipe().asProcessor().process(null));
|
.makePipe().asProcessor().process(null));
|
||||||
|
|
||||||
|
dt1 = l(dateTime(1988, 1, 2, 0, 0, 0, 0));
|
||||||
|
dt2 = l(dateTime(1987, 12, 29, 0, 0, 0, 0));
|
||||||
|
assertEquals(0, new DateDiff(Source.EMPTY, l("week"), dt1, dt2, UTC)
|
||||||
|
.makePipe().asProcessor().process(null));
|
||||||
|
assertEquals(0, new DateDiff(Source.EMPTY, l("weeks"), dt2, dt1, UTC)
|
||||||
|
.makePipe().asProcessor().process(null));
|
||||||
|
assertEquals(0, new DateDiff(Source.EMPTY, l("wk"), dt1, dt2, zoneId)
|
||||||
|
.makePipe().asProcessor().process(null));
|
||||||
|
assertEquals(0, new DateDiff(Source.EMPTY, l("ww"), dt2, dt1, zoneId)
|
||||||
|
.makePipe().asProcessor().process(null));
|
||||||
|
|
||||||
dt1 = l(dateTime(1988, 1, 5, 0, 0, 0, 0));
|
dt1 = l(dateTime(1988, 1, 5, 0, 0, 0, 0));
|
||||||
dt2 = l(dateTime(1996, 5, 13, 0, 0, 0, 0));
|
dt2 = l(dateTime(1996, 5, 13, 0, 0, 0, 0));
|
||||||
assertEquals(436, new DateDiff(Source.EMPTY, l("week"), dt1, dt2, UTC)
|
assertEquals(436, new DateDiff(Source.EMPTY, l("week"), dt1, dt2, UTC)
|
||||||
@ -285,6 +296,39 @@ public class DateDiffProcessorTests extends AbstractSqlWireSerializingTestCase<D
|
|||||||
assertEquals(-436, new DateDiff(Source.EMPTY, l("ww"), dt2, dt1, zoneId)
|
assertEquals(-436, new DateDiff(Source.EMPTY, l("ww"), dt2, dt1, zoneId)
|
||||||
.makePipe().asProcessor().process(null));
|
.makePipe().asProcessor().process(null));
|
||||||
|
|
||||||
|
dt1 = l(dateTime(1999, 8, 20, 0, 0, 0, 0));
|
||||||
|
dt2 = l(dateTime(1974, 3, 17, 0, 0, 0, 0));
|
||||||
|
assertEquals(-1326, new DateDiff(Source.EMPTY, l("week"), dt1, dt2, UTC)
|
||||||
|
.makePipe().asProcessor().process(null));
|
||||||
|
assertEquals(1326, new DateDiff(Source.EMPTY, l("weeks"), dt2, dt1, UTC)
|
||||||
|
.makePipe().asProcessor().process(null));
|
||||||
|
assertEquals(-1326, new DateDiff(Source.EMPTY, l("wk"), dt1, dt2, zoneId)
|
||||||
|
.makePipe().asProcessor().process(null));
|
||||||
|
assertEquals(1326, new DateDiff(Source.EMPTY, l("ww"), dt2, dt1, zoneId)
|
||||||
|
.makePipe().asProcessor().process(null));
|
||||||
|
|
||||||
|
dt1 = l(dateTime(1997, 2, 2, 0, 0, 0, 0));
|
||||||
|
dt2 = l(dateTime(1997, 9, 19, 0, 0, 0, 0));
|
||||||
|
assertEquals(32, new DateDiff(Source.EMPTY, l("week"), dt1, dt2, UTC)
|
||||||
|
.makePipe().asProcessor().process(null));
|
||||||
|
assertEquals(-32, new DateDiff(Source.EMPTY, l("weeks"), dt2, dt1, UTC)
|
||||||
|
.makePipe().asProcessor().process(null));
|
||||||
|
assertEquals(32, new DateDiff(Source.EMPTY, l("wk"), dt1, dt2, zoneId)
|
||||||
|
.makePipe().asProcessor().process(null));
|
||||||
|
assertEquals(-32, new DateDiff(Source.EMPTY, l("ww"), dt2, dt1, zoneId)
|
||||||
|
.makePipe().asProcessor().process(null));
|
||||||
|
|
||||||
|
dt1 = l(dateTime(1980, 11, 7, 0, 0, 0, 0));
|
||||||
|
dt2 = l(dateTime(1979, 4, 1, 0, 0, 0, 0));
|
||||||
|
assertEquals(-83, new DateDiff(Source.EMPTY, l("week"), dt1, dt2, UTC)
|
||||||
|
.makePipe().asProcessor().process(null));
|
||||||
|
assertEquals(83, new DateDiff(Source.EMPTY, l("weeks"), dt2, dt1, UTC)
|
||||||
|
.makePipe().asProcessor().process(null));
|
||||||
|
assertEquals(-83, new DateDiff(Source.EMPTY, l("wk"), dt1, dt2, zoneId)
|
||||||
|
.makePipe().asProcessor().process(null));
|
||||||
|
assertEquals(83, new DateDiff(Source.EMPTY, l("ww"), dt2, dt1, zoneId)
|
||||||
|
.makePipe().asProcessor().process(null));
|
||||||
|
|
||||||
dt1 = l(dateTime(1997, 9, 19, 0, 0, 0, 0));
|
dt1 = l(dateTime(1997, 9, 19, 0, 0, 0, 0));
|
||||||
dt2 = l(dateTime(2004, 8, 2, 7, 59, 23, 0));
|
dt2 = l(dateTime(2004, 8, 2, 7, 59, 23, 0));
|
||||||
assertEquals(60223, new DateDiff(Source.EMPTY, l("hour"), dt1, dt2, UTC)
|
assertEquals(60223, new DateDiff(Source.EMPTY, l("hour"), dt1, dt2, UTC)
|
||||||
|
@ -53,6 +53,29 @@ public class DateTimeProcessorTests extends AbstractSqlWireSerializingTestCase<D
|
|||||||
assertEquals(1, proc.process(dateTime(0L)));
|
assertEquals(1, proc.process(dateTime(0L)));
|
||||||
assertEquals(2, proc.process(dateTime(2017, 01, 02, 10, 10)));
|
assertEquals(2, proc.process(dateTime(2017, 01, 02, 10, 10)));
|
||||||
assertEquals(31, proc.process(dateTime(2017, 01, 31, 10, 10)));
|
assertEquals(31, proc.process(dateTime(2017, 01, 31, 10, 10)));
|
||||||
|
|
||||||
|
// Tested against MS-SQL Server and H2
|
||||||
|
proc = new DateTimeProcessor(DateTimeExtractor.ISO_WEEK_OF_YEAR, UTC);
|
||||||
|
assertEquals(1, proc.process(dateTime(1988, 1, 5, 0, 0, 0, 0)));
|
||||||
|
assertEquals(5, proc.process(dateTime(2001, 2, 4, 0, 0, 0, 0)));
|
||||||
|
assertEquals(6, proc.process(dateTime(1977, 2, 8, 0, 0, 0, 0)));
|
||||||
|
assertEquals(11, proc.process(dateTime(1974, 3, 17, 0, 0, 0, 0)));
|
||||||
|
assertEquals(16, proc.process(dateTime(1977, 4, 20, 0, 0, 0, 0)));
|
||||||
|
assertEquals(16, proc.process(dateTime(1994, 4, 20, 0, 0, 0, 0)));
|
||||||
|
assertEquals(17, proc.process(dateTime(2002, 4, 27, 0, 0, 0, 0)));
|
||||||
|
assertEquals(18, proc.process(dateTime(1974, 5, 3, 0, 0, 0, 0)));
|
||||||
|
assertEquals(22, proc.process(dateTime(1997, 5, 30, 0, 0, 0, 0)));
|
||||||
|
assertEquals(22, proc.process(dateTime(1995, 6, 4, 0, 0, 0, 0)));
|
||||||
|
assertEquals(28, proc.process(dateTime(1972, 7, 12, 0, 0, 0, 0)));
|
||||||
|
assertEquals(30, proc.process(dateTime(1980, 7, 26, 0, 0, 0, 0)));
|
||||||
|
assertEquals(33, proc.process(dateTime(1998, 8, 12, 0, 0, 0, 0)));
|
||||||
|
assertEquals(35, proc.process(dateTime(1995, 9, 3, 0, 0, 0, 0)));
|
||||||
|
assertEquals(37, proc.process(dateTime(1976, 9, 9, 0, 0, 0, 0)));
|
||||||
|
assertEquals(38, proc.process(dateTime(1997, 9, 19, 0, 0, 0, 0)));
|
||||||
|
assertEquals(45, proc.process(dateTime(1980, 11, 7, 0, 0, 0, 0)));
|
||||||
|
assertEquals(53, proc.process(dateTime(2005, 1, 1, 0, 0, 0, 0)));
|
||||||
|
assertEquals(1, proc.process(dateTime(2007, 12, 31, 0, 0, 0, 0)));
|
||||||
|
assertEquals(1, proc.process(dateTime(2019, 12, 31, 20, 22, 33, 987654321)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testApply_withTimezoneOtherThanUTC() {
|
public void testApply_withTimezoneOtherThanUTC() {
|
||||||
@ -62,6 +85,29 @@ public class DateTimeProcessorTests extends AbstractSqlWireSerializingTestCase<D
|
|||||||
|
|
||||||
proc = new DateTimeProcessor(DateTimeExtractor.DAY_OF_MONTH, zoneId);
|
proc = new DateTimeProcessor(DateTimeExtractor.DAY_OF_MONTH, zoneId);
|
||||||
assertEquals(1, proc.process(dateTime(2017, 12, 31, 20, 30)));
|
assertEquals(1, proc.process(dateTime(2017, 12, 31, 20, 30)));
|
||||||
|
|
||||||
|
// Tested against MS-SQL Server and H2
|
||||||
|
proc = new DateTimeProcessor(DateTimeExtractor.ISO_WEEK_OF_YEAR, UTC);
|
||||||
|
assertEquals(1, proc.process(dateTime(1988, 1, 5, 0, 0, 0, 0)));
|
||||||
|
assertEquals(5, proc.process(dateTime(2001, 2, 4, 0, 0, 0, 0)));
|
||||||
|
assertEquals(6, proc.process(dateTime(1977, 2, 8, 0, 0, 0, 0)));
|
||||||
|
assertEquals(11, proc.process(dateTime(1974, 3, 17, 0, 0, 0, 0)));
|
||||||
|
assertEquals(16, proc.process(dateTime(1977, 4, 20, 0, 0, 0, 0)));
|
||||||
|
assertEquals(16, proc.process(dateTime(1994, 4, 20, 0, 0, 0, 0)));
|
||||||
|
assertEquals(17, proc.process(dateTime(2002, 4, 27, 0, 0, 0, 0)));
|
||||||
|
assertEquals(18, proc.process(dateTime(1974, 5, 3, 0, 0, 0, 0)));
|
||||||
|
assertEquals(22, proc.process(dateTime(1997, 5, 30, 0, 0, 0, 0)));
|
||||||
|
assertEquals(22, proc.process(dateTime(1995, 6, 4, 0, 0, 0, 0)));
|
||||||
|
assertEquals(28, proc.process(dateTime(1972, 7, 12, 0, 0, 0, 0)));
|
||||||
|
assertEquals(30, proc.process(dateTime(1980, 7, 26, 0, 0, 0, 0)));
|
||||||
|
assertEquals(33, proc.process(dateTime(1998, 8, 12, 0, 0, 0, 0)));
|
||||||
|
assertEquals(35, proc.process(dateTime(1995, 9, 3, 0, 0, 0, 0)));
|
||||||
|
assertEquals(37, proc.process(dateTime(1976, 9, 9, 0, 0, 0, 0)));
|
||||||
|
assertEquals(38, proc.process(dateTime(1997, 9, 19, 0, 0, 0, 0)));
|
||||||
|
assertEquals(45, proc.process(dateTime(1980, 11, 7, 0, 0, 0, 0)));
|
||||||
|
assertEquals(53, proc.process(dateTime(2005, 1, 1, 0, 0, 0, 0)));
|
||||||
|
assertEquals(1, proc.process(dateTime(2007, 12, 31, 0, 0, 0, 0)));
|
||||||
|
assertEquals(1, proc.process(dateTime(2019, 12, 31, 20, 22, 33, 987654321)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testFailOnTime() {
|
public void testFailOnTime() {
|
||||||
|
@ -55,6 +55,28 @@ public class NonIsoDateTimeProcessorTests extends AbstractSqlWireSerializingTest
|
|||||||
assertEquals(17, proc.process(dateTime(766833730000L))); //1994-04-20T09:22:10Z[UTC]
|
assertEquals(17, proc.process(dateTime(766833730000L))); //1994-04-20T09:22:10Z[UTC]
|
||||||
assertEquals(29, proc.process(dateTime(79780930000L))); //1972-07-12T09:22:10Z[UTC]
|
assertEquals(29, proc.process(dateTime(79780930000L))); //1972-07-12T09:22:10Z[UTC]
|
||||||
assertEquals(33, proc.process(dateTime(902913730000L))); //1998-08-12T09:22:10Z[UTC]
|
assertEquals(33, proc.process(dateTime(902913730000L))); //1998-08-12T09:22:10Z[UTC]
|
||||||
|
|
||||||
|
// Tested against MS-SQL Server and H2
|
||||||
|
assertEquals(2, proc.process(dateTime(1988, 1, 5, 0, 0, 0, 0)));
|
||||||
|
assertEquals(6, proc.process(dateTime(2001, 2, 4, 0, 0, 0, 0)));
|
||||||
|
assertEquals(7, proc.process(dateTime(1977, 2, 8, 0, 0, 0, 0)));
|
||||||
|
assertEquals(12, proc.process(dateTime(1974, 3, 17, 0, 0, 0, 0)));
|
||||||
|
assertEquals(17, proc.process(dateTime(1977, 4, 20, 0, 0, 0, 0)));
|
||||||
|
assertEquals(17, proc.process(dateTime(1994, 4, 20, 0, 0, 0, 0)));
|
||||||
|
assertEquals(17, proc.process(dateTime(2002, 4, 27, 0, 0, 0, 0)));
|
||||||
|
assertEquals(18, proc.process(dateTime(1974, 5, 3, 0, 0, 0, 0)));
|
||||||
|
assertEquals(22, proc.process(dateTime(1997, 5, 30, 0, 0, 0, 0)));
|
||||||
|
assertEquals(23, proc.process(dateTime(1995, 6, 4, 0, 0, 0, 0)));
|
||||||
|
assertEquals(29, proc.process(dateTime(1972, 7, 12, 0, 0, 0, 0)));
|
||||||
|
assertEquals(30, proc.process(dateTime(1980, 7, 26, 0, 0, 0, 0)));
|
||||||
|
assertEquals(33, proc.process(dateTime(1998, 8, 12, 0, 0, 0, 0)));
|
||||||
|
assertEquals(36, proc.process(dateTime(1995, 9, 3, 0, 0, 0, 0)));
|
||||||
|
assertEquals(37, proc.process(dateTime(1976, 9, 9, 0, 0, 0, 0)));
|
||||||
|
assertEquals(38, proc.process(dateTime(1997, 9, 19, 0, 0, 0, 0)));
|
||||||
|
assertEquals(45, proc.process(dateTime(1980, 11, 7, 0, 0, 0, 0)));
|
||||||
|
assertEquals(1, proc.process(dateTime(2005, 1, 1, 0, 0, 0, 0)));
|
||||||
|
assertEquals(53, proc.process(dateTime(2007, 12, 31, 0, 0, 0, 0)));
|
||||||
|
assertEquals(53, proc.process(dateTime(2019, 12, 31, 20, 22, 33, 987654321)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testNonISOWeekOfYearInNonUTCTimeZone() {
|
public void testNonISOWeekOfYearInNonUTCTimeZone() {
|
||||||
@ -68,6 +90,28 @@ public class NonIsoDateTimeProcessorTests extends AbstractSqlWireSerializingTest
|
|||||||
assertEquals(17, proc.process(dateTime(766833730000L)));
|
assertEquals(17, proc.process(dateTime(766833730000L)));
|
||||||
assertEquals(29, proc.process(dateTime(79780930000L)));
|
assertEquals(29, proc.process(dateTime(79780930000L)));
|
||||||
assertEquals(33, proc.process(dateTime(902913730000L)));
|
assertEquals(33, proc.process(dateTime(902913730000L)));
|
||||||
|
|
||||||
|
// Tested against MS-SQL Server and H2
|
||||||
|
assertEquals(2, proc.process(dateTime(1988, 1, 5, 0, 0, 0, 0)));
|
||||||
|
assertEquals(5, proc.process(dateTime(2001, 2, 4, 0, 0, 0, 0)));
|
||||||
|
assertEquals(7, proc.process(dateTime(1977, 2, 8, 0, 0, 0, 0)));
|
||||||
|
assertEquals(11, proc.process(dateTime(1974, 3, 17, 0, 0, 0, 0)));
|
||||||
|
assertEquals(17, proc.process(dateTime(1977, 4, 20, 0, 0, 0, 0)));
|
||||||
|
assertEquals(17, proc.process(dateTime(1994, 4, 20, 0, 0, 0, 0)));
|
||||||
|
assertEquals(17, proc.process(dateTime(2002, 4, 27, 0, 0, 0, 0)));
|
||||||
|
assertEquals(18, proc.process(dateTime(1974, 5, 3, 0, 0, 0, 0)));
|
||||||
|
assertEquals(22, proc.process(dateTime(1997, 5, 30, 0, 0, 0, 0)));
|
||||||
|
assertEquals(22, proc.process(dateTime(1995, 6, 4, 0, 0, 0, 0)));
|
||||||
|
assertEquals(29, proc.process(dateTime(1972, 7, 12, 0, 0, 0, 0)));
|
||||||
|
assertEquals(30, proc.process(dateTime(1980, 7, 26, 0, 0, 0, 0)));
|
||||||
|
assertEquals(33, proc.process(dateTime(1998, 8, 12, 0, 0, 0, 0)));
|
||||||
|
assertEquals(35, proc.process(dateTime(1995, 9, 3, 0, 0, 0, 0)));
|
||||||
|
assertEquals(37, proc.process(dateTime(1976, 9, 9, 0, 0, 0, 0)));
|
||||||
|
assertEquals(38, proc.process(dateTime(1997, 9, 19, 0, 0, 0, 0)));
|
||||||
|
assertEquals(45, proc.process(dateTime(1980, 11, 7, 0, 0, 0, 0)));
|
||||||
|
assertEquals(53, proc.process(dateTime(2005, 1, 1, 0, 0, 0, 0)));
|
||||||
|
assertEquals(53, proc.process(dateTime(2007, 12, 31, 0, 0, 0, 0)));
|
||||||
|
assertEquals(53, proc.process(dateTime(2019, 12, 31, 20, 22, 33, 987654321)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testNonISODayOfWeekInUTC() {
|
public void testNonISODayOfWeekInUTC() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user