Необходимо получить в формате ДАТА (ГГГГ-ММ-ДД) из столбца типа данных NUMBER (123456789) - PullRequest
0 голосов
/ 21 января 2020

У меня есть столбец с типом данных NUMBER(32,0). В этом столбце фактически хранятся дата и отметка времени из приложения.

Мне нужно экспортировать этот столбец типа данных number как date.

, т. Е.

select column_name from table_name;

 o/p:
1368046452000

Я попробовал эту опцию для экспорта как Дата,

SELECT TO_DATE( 
         TO_TIMESTAMP('1970-01-01'
                     ,'YYYY-MM-DD'
         ) + NUMTODSINTERVAL(column_name/1000, 'SECOND')
        ,'YYYY-MM-DD')
FROM  table_name;

Это дает мне вывод "15-JUL-23", как и ожидалось.

Вопрос:

Эта таблица имеет около 900 + столбцы и в которых более 50 столбцов подобны этому числу data_type, в котором хранятся дата и время. Мне нужно преобразовать / отформатировать эти 50+ столбцов в YYYY-MM-DD.

Как я могу получить / экспортировать / выбрать все значения столбцов из таблицы, в которой вышеуказанные столбцы типа data_type должны возвращаться с форматом YYYY-MM-DD ?

Пожалуйста, помогите !!

Спасибо, Картик

Ответы [ 2 ]

3 голосов
/ 21 января 2020

Ваше время отображается на отметке времени 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 здесь

0 голосов
/ 21 января 2020

Просто ради чертового кода создайте функцию

Create or replace function MyConvert(p_val in number ) return varchar2
as
begin
    return TO_CHAR(TO_DATE('1970/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') + 
                NUMTODSINTERVAL(p_val / 1000,'SECOND'), 'YYYY-MM-DD');
end;

А затем в своем коде просто выполните

SELECT MyConvert(col1) col1, ..... MyConvert(col50) col50 FROM table

Получаемый вами «формат даты» на самом деле не является дата - это строковое представление даты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...