比较Oracle,PostgreSQL和SQL Server中的时间戳的常用方法

时间:2010-03-24 04:43:15

标签: sql oracle datetime postgresql

我正在编写一个SQL查询,其中包括查找时间戳是否落在特定的天数范围内。

我在PostgreSQL中写过,但它在Oracle和SQL Server中不起作用:

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

是否有通用的方法比较不同数据库的时间戳?

6 个答案:

答案 0 :(得分:17)

我不是SQL Server专家,但我知道这适用于Oracle和Postgres,我怀疑它可能适用于MSSQL但无法测试它。

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

或者如果你使用的是日期类型而不是时间戳,你可以这样做,但我很确定它不适用于MSSQL。而Oracle和Pg之间的DATE类型则完全不同。

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

正如OMG Ponies的评论中所指出的,您只能在日期类型中添加内注而不是时间戳。 (Oracle默默地将时间戳转换为日期)

答案 1 :(得分:7)

如何比较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

之后

答案 2 :(得分:3)

我不相信有一种通用语法可以在所有数据库引擎中运行。在SQL Server中,您可以这样执行:

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

我不确定甲骨文......

答案 3 :(得分:1)

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。 使用BETWEEN表达式的上限为-5的答案是错误的。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

再次这是针对Oracle的,假设intime是TIMESTAMP(3)数据类型,你可以这样做

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