Ваше время отображается на отметке времени Unix, которая будет измерять миллисекунды с 1970-01-01 в часовом поясе UT C.
Вы можете использовать:
SELECT TIMESTAMP '1970-01-01 00:00:00 UTC' + column_name * INTERVAL '0.001' SECOND
FROM table_name;
, который получит значение как тип данных TIMESTAMP
(так как он может иметь доли секунды).
Если вы хотите, чтобы оно было DATE
, тогда используйте CAST
для преобразования это:
SELECT CAST(
TIMESTAMP '1970-01-01 00:00:00 UTC' + column_name * INTERVAL '0.001' SECOND
AS DATE
)
FROM table_name;
Если вы хотите это в определенном c часовом поясе (а не UT C), тогда используйте AT TIME ZONE 'your_tz'
:
SELECT CAST(
( TIMESTAMP '1970-01-01 00:00:00 UTC' + column_name * INTERVAL '0.001' SECOND )
AT TIME ZONE 'PST'
AS DATE
)
FROM table_name;
Так что для вашего теста данные:
CREATE TABLE table_name ( column_name ) AS
SELECT 1368046452000 FROM DUAL;
запрос:
SELECT ( TIMESTAMP '1970-01-01 00:00:00 UTC' + column_name * INTERVAL '0.001' SECOND )
AS UTC_TIMESTAMP,
CAST(
( TIMESTAMP '1970-01-01 00:00:00 UTC' + column_name * INTERVAL '0.001' SECOND )
AS DATE
) AS UTC_DATE,
CAST(
( TIMESTAMP '1970-01-01 00:00:00 UTC' + column_name * INTERVAL '0.001' SECOND )
AT TIME ZONE 'PST'
AS DATE
) AS PST_DATE
FROM table_name;
выдаст:
UTC_TIMESTAMP | UTC_DATE | PST_DATE
:-------------------------------- | :------------------ | :------------------
2013-05-08 20:54:12.000000000 UTC | 2013-05-08 20:54:12 | 2013-05-08 13:54:12
db <> fiddle здесь