Общий способ сравнения отметок времени в Oracle, PostgreSQL и SQL Server - PullRequest
19 голосов
/ 24 марта 2010

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

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

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

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

Ответы [ 6 ]

17 голосов
/ 24 марта 2010

Я не эксперт по 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, вы можете добавлять только целые числа в типы дат, а не временные метки. (Oracle молча устанавливает текущую метку)

7 голосов
/ 24 октября 2012

Как сравнить две метки времени в 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');

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

3 голосов
/ 24 марта 2010

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

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

Я не уверен насчет Oracle ...

1 голос
/ 24 марта 2010

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

0 голосов
/ 06 декабря 2017

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

select * from MYTABLE where intime >= to_timestamp('2014-10-01 7:00:56', 'YYYY-MM-dd HH24:MI:SS')
0 голосов
/ 29 августа 2015
select * from timing where (db_time < CURRENT_DATE) AND (db_time > (CURRENT_DATE - INTERVAL '1' DAY)) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...