我正在编写一个SQL查询,其中包括查找时间戳是否落在特定的天数范围内。
我在PostgreSQL中写过,但它在Oracle和SQL Server中不起作用:
AND creation_date < (CURRENT_TIMESTAMP - interval '5 days')
AND creation_date >= (CURRENT_TIMESTAMP - interval '15 days')
是否有通用的方法比较不同数据库的时间戳?
答案 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)
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')