【发布时间】:2016-08-07 11:46:41
【问题描述】:
如何仅查询 Orace 日期字段的时间部分。即:
select * from mytable
where
date_column < '05:30:00'
无论日期如何,都希望查询返回 date_column 表示的时间小于 5:30 的任何行。
【问题讨论】:
-
这是一个日期列
如何仅查询 Orace 日期字段的时间部分。即:
select * from mytable
where
date_column < '05:30:00'
无论日期如何,都希望查询返回 date_column 表示的时间小于 5:30 的任何行。
【问题讨论】:
你可以这样试试:
select * from mytable
where
to_char( date_column, 'HH24:MI:SS' ) < '05:30:00'
【讨论】:
您可以查看日期距离午夜还有多远,并对其进行过滤:
select * from mytable
where date_column - trunc(date_column) < 5.5/24
date_column - trunc(date_column) 计算将为您提供一天的一小部分,这对于date arithmetic 来说是正常的。 5.5/24 是 05:30 的时间所代表的一天中的分数; 24 小时中的 5.5 小时。
如果该列是时间戳而不是日期,您会看到一个区间数据类型作为减法的结果。如果您喜欢或发现它比 5.5/24 更容易理解(或者比较复杂的时间,更难用分数表示),您可以使用 an interval literal:
select * from mytable
where date_column < trunc(date_column) + interval '0 05:30:00' day to second;
这样一来,您将列中的日期与截断的日期(即当天的午夜)进行比较,并添加 5 小时 30 分钟,即当天的 05:30。
在 CTE 中包含简单数据的快速演示,以及第三个非常轻微的变体,但它们都得到相同的结果:
with mytable (date_column) as (
select to_date('2016-04-15 05:29:29', 'YYYY-MM-DD HH24:MI:SS') from dual
union all select to_date('2016-04-14 05:29:29', 'YYYY-MM-DD HH24:MI:SS') from dual
union all select to_date('2016-04-15 05:30:30', 'YYYY-MM-DD HH24:MI:SS') from dual
)
select * from mytable
where date_column < trunc(date_column) + 5.5/24;
DATE_COLUMN
-------------------
2016-04-15 05:29:29
2016-04-14 05:29:29
请注意,像这样对列的任何操作都会阻止使用索引。如果您必须定期执行此操作,则可能值得添加一个虚拟列/索引来执行该计算。
【讨论】:
HH24 掩码是安全的。
您需要将时间转换回日期,否则您只是在进行字符串比较。 Oracle 并没有真正的聪明方法来做到这一点。最简单的方法是将两个日期都放在同一天并进行比较。
即
select *
from mytable
where to_date ('01.01.2000 ' || to_char (date_column, 'hh24:mi:ss'), 'dd.mm.yyyy hh24:mi:ss') <
to_date ('01.01.2000' || '05:30:00', 'dd.mm.yyyy hh24:mi:ss')
【讨论】: