如何查询Orace日期字段的时间部分。即:
select * from mytable
where
date_column < '05:30:00'
希望查询返回date_column所代表的时间小于5:30的任何行,无论日期如何。
答案 0 :(得分:3)
您可以尝试这样:
select * from mytable
where
to_char( date_column, 'HH24:MI:SS' ) < '05:30:00'
答案 1 :(得分:2)
您可以查看日期距离午夜的距离,并对其进行过滤:
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小时。
如果列是时间戳而不是日期,则会看到间隔数据类型作为减法的结果。如果你愿意,你可以使用an interval literal,或者比5.5 / 24更容易理解(或者有更复杂的比较时间,更难以表达为分数):
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
请注意,对此列的任何操作都会阻止使用索引。如果您必须定期执行此操作,则可能需要添加执行该计算的虚拟列/索引。
答案 2 :(得分:0)
你需要把时间重新安排,否则你只是在进行字符串比较。 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')