Общий способ сравнить временную метку в 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')
Есть ли общий способ сравнить временную метку в разных базах данных?
Ответы
Ответ 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')