Подтвердить что ты не робот

Общий способ сравнить временную метку в Oracle, PostgreSQL и SQL Server

Я пишу SQL-запрос, который включает в себя поиск, если timestamp падает в определенном диапазоне дней.

Я написал это в PostgreSQL, но он не работает в Oracle и SQL Server:

AND creation_date < (CURRENT_TIMESTAMP - interval '5 days')
AND creation_date >= (CURRENT_TIMESTAMP - interval '15 days')

Есть ли общий способ сравнить временную метку в разных базах данных?

4b9b3361

Ответ 1

Я не эксперт SQL Server, но я знаю, что это работает на Oracle и Postgres, и я подозреваю, что он может работать на MSSQL, но не имеет возможности протестировать его ATM.

AND creation_date < (CURRENT_TIMESTAMP - interval '5' day)
AND creation_date >= (CURRENT_TIMESTAMP - interval '15' day)

Или, если вы используете тип даты вместо метки времени, вы можете это сделать, но я уверен, что он не будет работать на MSSQL. И тип DATE совсем отличается между Oracle и Pg.

AND creation_date < CURRENT_DATE - 5
AND creation_date >= CURRENT_DATE - 15

Как было отмечено в комментариях для OMG Ponies, вы можете добавлять только типы данных в типы Date, а не timestamps. (Oracle молча отбрасывает метку времени)

Ответ 2

Как сравнить две метки времени в postgresql, следующее возвращает true:

select to_timestamp('2010-01-01 10:10:85.123', 'YYYY-MM-dd HH:MI:SS.MS') <
    to_timestamp('2012-01-01 10:10:85.123', 'YYYY-MM-dd HH:MI:SS.MS');

Возвращает true, поскольку 2012 находится после 2010

Ответ 3

Я не верю, что существует общий синтаксис, который будет работать во всех СУБД. В SQL Server вы делаете это следующим образом:

AND creation_date BETWEEN DateAdd(dd, -5, GetUtcDate()) AND DateAdd(dd, -15, GetUtcDate())

Я не уверен в Oracle...

Ответ 4

Oracle (я тестировал оба этих решения):

AND (creation_date BETWEEN sysdate-15 AND sysdate-6)

Этот синтаксис также действителен:

AND (creation_date BETWEEN current_timestamp - INTERVAL '15' DAY 
                       AND current_timestamp - INTERVAL '6' DAY)

Обратите внимание, что SYSDATE и CURRENT_TIMESTAMP являются синонимами (вид - см. комментарии).

Обратите внимание, что BETWEEN возвращает значения включительно. Поскольку вы ищете значения >= date-15, но < date-5, вам необходимо указать -15 до -6 при использовании BETWEEN. Ответы с использованием верхней границы -5 с выражением BETWEEN неверны.

Ответ 5

select * from timing where (db_time < CURRENT_DATE) AND (db_time > (CURRENT_DATE - INTERVAL '1' DAY)) ;

Ответ 6

Снова это специфично для Oracle, предположим, что intime - это тип данных TIMESTAMP (3), вы можете сделать это

select * from MYTABLE where intime >= to_timestamp('2014-10-01 7:00:56', 'YYYY-MM-dd HH24:MI:SS')