Может быть ошибка в Oracle.Вы можете сократить запрос до этого:
SELECT
TO_CHAR(CAST(TIMESTAMP '2018-11-04 00:00:00 -05:00' AT TIME ZONE 'America/New_York' AS TIMESTAMP), 'yyyy-mm-dd hh24:mi:ss') AS my_date_ny_ts,
DUMP(CAST(TIMESTAMP '2018-11-04 00:00:00 -05:00' AT TIME ZONE 'America/New_York' AS TIMESTAMP)) AS my_date_ny_ts_dump
FROM DUAL
UNION ALL
SELECT
TO_CHAR(CAST(TIMESTAMP '2018-11-04 00:00:00 -06:00' AT TIME ZONE 'America/New_York' AS TIMESTAMP), 'yyyy-mm-dd hh24:mi:ss'),
DUMP(CAST(TIMESTAMP '2018-11-04 00:00:00 -06:00' AT TIME ZONE 'America/New_York' AS TIMESTAMP))
FROM DUAL;
+--------------------------------------------------------------------------------------+
|MY_DATE_NY_TS |MY_DATE_NY_TS_DUMP |
+--------------------------------------------------------------------------------------+
|2018-11-04 01:00:00|Typ=187 Len=20: 226,7,11,4,1,0,0,0,0,0,0,0,252,0,3,0,100,0,11,3 |
|2018-11-04 01:00:00|Typ=187 Len=20: 226,7,11,4,1,0,0,48,0,0,0,0,251,0,3,44,100,0,48,44|
+--------------------------------------------------------------------------------------+
Как видите, значения меток времени одинаковы, однако значения DUMP()
различны, т.е. вы получите две строки, если наберете GROUP BY
.
Вы можете запустить его немного по-другому.На самом деле я ожидал бы того же результата, что и выше (независимо от того, считаете ли вы это правильным или нет), но он отличается:
WITH t AS
(SELECT
CAST(TIMESTAMP '2018-11-04 00:00:00 -05:00' AT TIME ZONE 'America/New_York' AS TIMESTAMP) AS my_date_ny_ts
FROM DUAL
UNION ALL
SELECT
CAST(TIMESTAMP '2018-11-04 00:00:00 -06:00' AT TIME ZONE 'America/New_York' AS TIMESTAMP)
FROM DUAL)
SELECT TO_CHAR(my_date_ny_ts, 'yyyy-mm-dd hh24:mi:ss') AS my_date_ny_ts,
DUMP(my_date_ny_ts) AS my_date_ny_ts_dump
FROM t;
+--------------------------------------------------------------------------------------+
|MY_DATE_NY_TS |MY_DATE_NY_TS_DUMP |
+--------------------------------------------------------------------------------------+
|2018-11-04 01:00:00|Typ=180 Len=7: 120,118,11,4,2,1,1 |
|2018-11-04 01:00:00|Typ=180 Len=7: 120,118,11,4,2,1,1 |
+--------------------------------------------------------------------------------------+
Это выглядит странно для меня.Хотя я сделал CAST(... AS TIMESTAMP)
для обоих, как только я получаю Typ=187
, и как только я получаю Typ=180
в DUMP.
Похоже, что тип SQL TIMESTAMP
180 (см. Встроенные типы данных Oracle ) ведет себя иначе, чем тип PL / SQL TIMESTAMP
187 (см. ПАКЕТ SYS.dbms_types
) -но я не знаю почему.
В качестве обходного пути я бы предложил использовать функцию SYS_EXTRACT_UTC(...)
вместо CAST(... AS TIMESTAMP)
.