Uploaded image for project: 'Calcite'
  1. Calcite
  2. CALCITE-2989

Use ISO-8601 calendar when converting between java.sql types and UNIX timestamps

    XMLWordPrintableJSON

Details

    Description

      Converting java.sql types to unix timestamps requires extra steps to also convert to the correct calendar. Unix timestamps should follow the proleptic Gregorian calendar as defined by ISO-8601. Java uses the standard Gregorian calendar for java.sql types and switches to the Julian calendar for dates before the Gregorian shift.

      If we uses avatica's DateTimeUtils the dates less than 2299161 will cause an error result in Flink table/sql , test code :

      testAllApis(
        "1500-04-30 12:00:00".cast(Types.SQL_TIMESTAMP),
        "'1500-04-30 12:00:00'.cast(SQL_TIMESTAMP)",
        "CAST('1500-04-30 12:00:00' AS TIMESTAMP)",
        "1500-04-30 12:00:00.0")
      

      result :

      Expected :1500-04-30 12:00:00.0
      Actual :1500-04-20 12:00:00.0
      

      another case is here : 

      https://issues.apache.org/jira/browse/FLINK-11935

      I find a key code snippet has been removed in CALCITE-1884 which caused this issue :

      if (j < 2299161) {
         j = day + (153 * m + 2) / 5 + 365 * y + y / 4 - 32083;
      }
      

       

      Attachments

        Issue Links

          Activity

            People

              freastro Gregory Hart
              yanghua vinoyang
              Votes:
              0 Vote for this issue
              Watchers:
              8 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Time Tracking

                  Estimated:
                  Original Estimate - Not Specified
                  Not Specified
                  Remaining:
                  Remaining Estimate - 0h
                  0h
                  Logged:
                  Time Spent - 2h 10m
                  2h 10m