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



我正在寻找一种方法来确定时间戳是否介于两次之间,而不考虑该时间戳中的日期。例如,如果时间戳中的时间介于"00:00:00.000"(午夜)和"01:00:00.000"(凌晨1点)之间,则无论具体日期如何,我都希望选择该行。

我在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'

您的解决方案在我看来是正确的,只是我还没有尝试过substr函数。这是我在以前的一个项目中使用的:

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

使用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 ;

作为@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演示。

但是,只有当时隙与小时完全一致时,这才是简单的;否则,您还需要提取其他元素,逻辑可能会变得混乱,@Ankit的方法总体上会更简单。

最新更新