Oracle按时查询(而不是日期)

时间:2016-04-15 13:15:46

标签: sql oracle date datetime

如何查询Orace日期字段的时间部分。即:

select * from mytable 
where 
date_column < '05:30:00'

希望查询返回date_column所代表的时间小于5:30的任何行,无论日期如何。

3 个答案:

答案 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')