diff --git a/core/src/main/java/org/opensearch/sql/expression/datetime/DateTimeFormatterUtil.java b/core/src/main/java/org/opensearch/sql/expression/datetime/DateTimeFormatterUtil.java index d23cbc2df3..10507533bd 100644 --- a/core/src/main/java/org/opensearch/sql/expression/datetime/DateTimeFormatterUtil.java +++ b/core/src/main/java/org/opensearch/sql/expression/datetime/DateTimeFormatterUtil.java @@ -173,7 +173,7 @@ interface DateTimeFormatHandler { .put("%T", "HH:mm:ss") // %T => HH:mm:ss .put("%W", "EEEE") // %W => EEEE - Weekday name (Sunday..Saturday) .put("%Y", "u") // %Y => yyyy - Year, numeric, 4 digits - .put("%y", "u") // %y => yy - Year, numeric, 2 digits + .put("%y", "uu") // %y => yy - Year, numeric, 2 digits .put("%f", "n") // %f => n - Nanoseconds // The following have been implemented but cannot be aligned with // MySQL due to the limitations of the DatetimeFormatter diff --git a/core/src/test/java/org/opensearch/sql/expression/datetime/StrToDateTest.java b/core/src/test/java/org/opensearch/sql/expression/datetime/StrToDateTest.java index 7f0861d9c3..d0943d54b9 100644 --- a/core/src/test/java/org/opensearch/sql/expression/datetime/StrToDateTest.java +++ b/core/src/test/java/org/opensearch/sql/expression/datetime/StrToDateTest.java @@ -53,6 +53,13 @@ private static Stream getTestDataForStrToDate() { "%Y,%m,%d,%h,%i", new ExprTimestampValue("2000-01-01 10:11:00"), TIMESTAMP), + Arguments.of( + "01-May-13", "%d-%b-%y", new ExprTimestampValue("2013-05-01 00:00:00"), TIMESTAMP), + Arguments.of( + "01-Jan-00", "%d-%b-%y", new ExprTimestampValue("2000-01-01 00:00:00"), TIMESTAMP), + // Behavior consistent with OpenSearch Core + Arguments.of( + "31-Jul-99", "%d-%b-%y", new ExprTimestampValue("2099-07-31 00:00:00"), TIMESTAMP), // Invalid Arguments (should return null) Arguments.of("a09:30:17", "a%h:%i:%s", ExprNullValue.of(), UNDEFINED), diff --git a/integ-test/src/test/java/org/opensearch/sql/ppl/DateTimeFunctionIT.java b/integ-test/src/test/java/org/opensearch/sql/ppl/DateTimeFunctionIT.java index 3ea6897087..f688e5a42c 100644 --- a/integ-test/src/test/java/org/opensearch/sql/ppl/DateTimeFunctionIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/ppl/DateTimeFunctionIT.java @@ -1486,6 +1486,14 @@ public void testStrToDate() throws IOException { TEST_INDEX_DATE, "%d,%m,%Y")); verifySchema(result, schema("f", null, "timestamp")); verifySome(result.getJSONArray("datarows"), rows("2013-05-01 00:00:00")); + // two digits year case + result = + executeQuery( + String.format( + "source=%s | eval f = str_to_date('1-May-13', '%s') | fields f", + TEST_INDEX_DATE, "%d-%b-%y")); + verifySchema(result, schema("f", null, "timestamp")); + verifySome(result.getJSONArray("datarows"), rows("2013-05-01 00:00:00")); } @Test diff --git a/integ-test/src/test/java/org/opensearch/sql/sql/DateTimeFunctionIT.java b/integ-test/src/test/java/org/opensearch/sql/sql/DateTimeFunctionIT.java index 0ec77f9f31..56ff2fafc1 100644 --- a/integ-test/src/test/java/org/opensearch/sql/sql/DateTimeFunctionIT.java +++ b/integ-test/src/test/java/org/opensearch/sql/sql/DateTimeFunctionIT.java @@ -920,6 +920,10 @@ public void testStrToDate() throws IOException { "SELECT str_to_date(firstname," + " '%%Y-%%m-%%d %%h:%%i:%%s') FROM %s LIMIT 2", TEST_INDEX_BANK)); verifyDataRows(result, rows((Object) null), rows((Object) null)); + + // two digits year case + result = executeQuery("SELECT str_to_date('23-Oct-17 00:00:00', '%d-%b-%y %h:%i:%s')"); + verifyDataRows(result, rows("2017-10-23 00:00:00")); } @Test