diff --git a/core/src/test/java/org/opensearch/sql/expression/datetime/ExtractTest.java b/core/src/test/java/org/opensearch/sql/expression/datetime/ExtractTest.java index 02d50d0b59..d7635de610 100644 --- a/core/src/test/java/org/opensearch/sql/expression/datetime/ExtractTest.java +++ b/core/src/test/java/org/opensearch/sql/expression/datetime/ExtractTest.java @@ -92,19 +92,23 @@ private void datePartWithTimeArgQuery(String part, String time, long expected) { @Test public void testExtractDatePartWithTimeType() { - datePartWithTimeArgQuery( - "DAY", timeInput, LocalDate.now(functionProperties.getQueryStartClock()).getDayOfMonth()); + LocalDate now = LocalDate.now(functionProperties.getQueryStartClock()); - datePartWithTimeArgQuery( - "WEEK", - timeInput, - LocalDate.now(functionProperties.getQueryStartClock()).get(ALIGNED_WEEK_OF_YEAR)); + datePartWithTimeArgQuery("DAY", timeInput, now.getDayOfMonth()); - datePartWithTimeArgQuery( - "MONTH", timeInput, LocalDate.now(functionProperties.getQueryStartClock()).getMonthValue()); + // To avoid flaky test, skip the testing in December and January because the WEEK is ISO 8601 + // week-of-week-based-year which is considered to start on a Monday and week 1 is the first week + // with >3 days. it is possible for early-January dates to be part of the 52nd or 53rd week of + // the previous year, and for late-December dates to be part of the first week of the next year. + // For example, 2005-01-02 is part of the 53rd week of year 2004, while 2012-12-31 is part of + // the first week of 2013 + if (now.getMonthValue() != 1 && now.getMonthValue() != 12) { + datePartWithTimeArgQuery("WEEK", datetimeInput, now.get(ALIGNED_WEEK_OF_YEAR)); + } - datePartWithTimeArgQuery( - "YEAR", timeInput, LocalDate.now(functionProperties.getQueryStartClock()).getYear()); + datePartWithTimeArgQuery("MONTH", timeInput, now.getMonthValue()); + + datePartWithTimeArgQuery("YEAR", timeInput, now.getYear()); } @ParameterizedTest(name = "{0}") diff --git a/docs/user/dql/functions.rst b/docs/user/dql/functions.rst index a347614ba4..bc967b305f 100644 --- a/docs/user/dql/functions.rst +++ b/docs/user/dql/functions.rst @@ -1944,11 +1944,11 @@ The format specifiers found in this table are the same as those found in the `DA * - DAY - %d * - WEEK - - %X + - %v * - MONTH - %m * - YEAR - - %V + - %Y * - SECOND_MICROSECOND - %s%f * - MINUTE_MICROSECOND @@ -1984,6 +1984,10 @@ Example:: | 202302 | +------------------------------------------------+ +Notice: + +Function `extract(WEEK FROM ...)` returns the number of the ISO 8601 week-of-week-based-year. ISO week-numbering is considered to start on a Monday and week 1 is the first week with >3 days. In the ISO week-numbering system, it is possible for early-January dates to be part of the 52nd or 53rd week of the previous year, and for late-December dates to be part of the first week of the next year. For example, 2005-01-02 is part of the 53rd week of year 2004, while 2012-12-31 is part of the first week of 2013. Ref https://en.wikipedia.org/wiki/ISO_week_date + FROM_DAYS ---------