我正在寻找一种方法来确定时间戳是否落在两次之间,无论该时间戳中的 date 如何。因此,例如,如果时间戳中的时间介于'00:00:00.000'(午夜)和'01:00:00.000'(凌晨1点)之间,那么无论具体日期如何,我都要选择该行。 / p>
我在to_char
和to_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'
答案 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
但是,如果时间段与小时数完全一致,这只会是直截了当的;否则你也需要提取其他元素,逻辑可能会让人感到困惑,@ Ankit的方法总体上会更简单。