SQL-запрос для преобразования числового значения в дату - PullRequest
0 голосов
/ 19 сентября 2019

В моей таблице транзакций есть идентификатор Number (11), имя Varchar2 (25), номер транзакции (22).

Необходимо написать SQL-запрос для получения сведений о транзакции.транзакция должна быть возвращена в формате даты и времени вместо числа.

transaction table 
ID   Name   transactiondate    
1    AAA    2458010   
2    BBB    2458351
3    CCC    2458712

Я получил следующий результат, когда я выполняю следующий запрос

Select * from transaction where transactiondate <= TOCHAR(todate('2019/09/17 00:00:00', 'YYYY/MM/DD hh24:mi:ss') , 'J');
ID   Name   transactiondate    
1    AAA    2458010   
2    BBB    2458351

Я получил синтаксическую ошибку запроса, когда япопытался выполнить приведенный ниже запрос

Select name, convert(datetime, convert(varchar(10), transactiondate)) as txndateformat 
from transaction;

Ожидается запрос, который должен содержать имя возврата и дату транзакции в формате даты, а не числа.

Результат ниже, когда я выполняю запрос ниже

Desc transaction;
Name             Null?     Type
Id               Not Null  Number(19)
Name             Not Null  VarChar2(100)
transactiondate  Not Null  Number(22)

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

Все зависит от того, когда вы измеряете нулевое время и от каких единиц измерения.

Вот несколько типичных решений:

Настройка Oracle :

CREATE TABLE transaction ( ID, Name, transactiondate ) AS
SELECT 1, 'AAA', 2456702 FROM DUAL UNION ALL
SELECT 2, 'BBB', 2456703 FROM DUAL

Запрос :

SELECT name,
       TO_DATE( transactiondate, 'J' )
         AS julian_date,
       DATE '1970-01-01' + NUMTODSINTERVAL( transactiondate / 1000, 'SECOND' )
         AS unix_timestamp,
       DATE '1970-01-01' + NUMTODSINTERVAL( transactiondate, 'SECOND' )
         AS seconds_since_1970,
       DATE '1970-01-01' + NUMTODSINTERVAL( transactiondate, 'MINUTE' )
         AS minutes_since_1970,
       DATE '1970-01-01' + NUMTODSINTERVAL( transactiondate, 'HOUR' )
         AS hours_since_1970,
       DATE '1900-01-01' + NUMTODSINTERVAL( transactiondate, 'HOUR' )
         AS hours_since_1900,
       DATE '1899-12-30' + transactiondate
         AS excel_date
FROM   transaction

Вывод :

NAME | JULIAN_DATE         | UNIX_TIMESTAMP      | SECONDS_SINCE_1970  | MINUTES_SINCE_1970  | HOURS_SINCE_1970    | HOURS_SINCE_1900    | EXCEL_DATE         
:--- | :------------------ | :------------------ | :------------------ | :------------------ | :------------------ | :------------------ | :------------------
AAA  | 2014-02-13 00:00:00 | 1970-01-01 00:40:56 | 1970-01-29 10:25:02 | 1974-09-03 01:02:00 | 2250-04-05 14:00:00 | 2180-04-04 14:00:00 | 8626-03-21 00:00:00
BBB  | 2014-02-14 00:00:00 | 1970-01-01 00:40:56 | 1970-01-29 10:25:03 | 1974-09-03 01:03:00 | 2250-04-05 15:00:00 | 2180-04-04 15:00:00 | 8626-03-22 00:00:00

дБ<> fiddle здесь

(Примечание: даты Excel немного сложнее, если вы хотите поддерживать значения до 1900-03-01, но большинство людейв этом нет необходимости, поэтому есть только упрощенная версия, включенная выше.)

0 голосов
/ 19 сентября 2019

Я предполагаю, что числа являются числами эпох .

Для SQL Server:

SELECT DATEADD(ss, 2456702, '19700101') --ss means interval = seconds

Для Oracle:

select to_date('19700101', 'YYYYMMDD') + ( 1 / 24 / 60 / 60) * 2456702
from dual;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...