非常快速的问题,如果我有一个字段,例如closed_date,它有一个日期时间,即
01-JAN-19 09.00.00.000000000
我只想看看每天上午09:00至10:00之间关闭的案件,语法是什么?我该如何在时间上删节,只检查每天上午9点至10点之间关闭的案件?
非常感谢
答案 0 :(得分:2)
您可以单独查看小时部分;当有时间戳时,您可以提取小时数:
where extract(hour from closed_date) = 9
将在时间为09:00:00或之后以及之前(不包括)10:00:00的行中查找行。
通常,当在“ 9到10”之间查看数据时,您实际上并不想包含上限,因为如果您也在查看“ 10到11”之间的数据,那么恰好是10两者中都包含:00:00,这可能不是预期的。因此,日期/时间比较通常使用>=
和<
而不是between
;您还可以使用字符串比较来做到这一点,您可以考虑将其比较清楚:
where to_char(closed_date, 'HH24:MI:SS') >= '09:00:00'
and to_char(closed_date, 'HH24:MI:SS') < '10:00:00'
或更简单
where to_char(closed_date, 'HH24') >= '09'
and to_char(closed_date, 'HH24') < '10'
在这种情况下,因为它是一个小时,所以与:
where to_char(closed_date, 'HH24') = '09'
但是随后您还是只看小时部分,将其提取为数字会更简化(IMO)。
答案 1 :(得分:1)
您似乎正在寻找根据小时列过滤时间戳列的条件。有多种方法可以从时间戳中提取日期部分,这是一种使用TO_CHAR的解决方案:
TO_CHAR(closed_date, 'hh24') = '09'
这将与时间大于或等于9 AM并且严格小于10 AM的时间戳匹配。
答案 2 :(得分:0)
您可以使用oracle的提取功能
SELECT EXTRACT(HOUR FROM timestamp_col_value) AS CURRENT_HOUR
FROM DUAL;
请注意,提取功能仅适用于MONTH / DAY / HOUR和日期类型的某些组合。 See here for more details.
如果要从日期时间中提取一个小时,则需要先将其转换为时间戳,即
SELECT EXTRACT(HOUR FROM CAST(SYSDATE AS TIMESTAMP)) AS CURRENT_HOUR
FROM DUAL;
答案 3 :(得分:-1)
select regexp_Replace('01-JAN-19 09.00.00.000000000','\d+-\w+-\d+ ') from dual
但是,如果您想在几个小时之间进行搜索,请尝试EXTRACT
,例如:
SELECT *
FROM your_table
WHERE to_char(your_column,
'yyyy-mm-dd hh24:mi:ss.ff a.m.',
'nls_date_language=american') in (9,10)
更新的答案。如果没有nls_Date_language参数,则9点钟的时间也可能是9.pm,也就是21。