Oracle SQL - 确定时间戳是否在一个范围内,不包括日期

时间:2013-08-15 20:49:18

标签: sql oracle timestamp

我正在寻找一种方法来确定时间戳是否落在两次之间,无论该时间戳中的 date 如何。因此,例如,如果时间戳中的时间介于'00:00:00.000'(午夜)和'01:00:00.000'(凌晨1点)之间,那么无论具体日期如何,我都要选择该行。 / p>

我在to_charto_date函数上尝试了很多不同的变体,但我一直都会遇到错误。来自Informix,Oracle似乎要复杂得多。

我尝试过最接近“正确”(我认为)的事情是:

SELECT *
FROM my_table
WHERE SUBSTR(TO_CHAR(my_timestamp), 10) > '00:00:00.000'
AND SUBSTR(TO_CHAR(my_timestamp), 10) < '01:00:00.000'

......但没有任何作用。任何提示或技巧?

我找到了一种方法,但如果它存在,我仍然会更喜欢一些不那么黑的东西。

SUBSTR(SUBSTR(TO_CHAR(my_timestamp), 11), 0, 12) > '01.00.00.000'

3 个答案:

答案 0 :(得分:4)

除非我没有尝试过substr函数,否则你的解决方案对我来说是正确的。这是我在之前的一个项目中使用的:

select * from orders 
   where to_char(my_timestamp,'hh24:mi:ss.FF3') 
   between '00:00:00.000' and '01:00:00.123';

答案 1 :(得分:1)

使用TRUNC(my_timestamp, 'J')删除小时数,只获取“2013-08-15 00:00:00.00”。 所以:

WHERE my_timestamp - TRUNC(my_timestamp, 'J') > 0 
AND my_timestamp - TRUNC(my_timestamp, 'J') < 1/24 ;

答案 2 :(得分:0)

作为@ kubanczyk答案的变体,因为这些是时间戳,当你从截断形式中减去一个值时,你得到一个间隔:

select systimestamp - trunc(systimestamp) from dual;

SYSTIMESTAMP-TRUNC(SYSTIMESTAMP)
---------------------------------------------------------------------------
+000000000 09:46:46.589795

哪个不是很有帮助。但是,如果您总是在寻找确切的小时数,例如,您可以从中提取小时数:

select extract (hour from systimestamp - trunc(systimestamp)) from dual;

EXTRACT(HOURFROMSYSTIMESTAMP-TRUNC(SYSTIMESTAMP))
-------------------------------------------------
                                                9

因此,在您的示例中,您可以使用:

SELECT *
FROM my_table
WHERE EXTRACT(HOUR FROM my_timestamp - TRUNC(my_timestamp)) = 0

SQL Fiddle demo

但是,如果时间段与小时数完全一致,这只会是直截了当的;否则你也需要提取其他元素,逻辑可能会让人感到困惑,@ Ankit的方法总体上会更简单。