2016-04-15 73 views
1

如何查询Orace日期字段的时间部分。即:Oracle查询按时(而不是日期)

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' 
+0

似乎没有工作... –

+0

对不起,它工作!我的错。 –

+1

亚历克斯的答案也有效,但这是最简单的遵循伊姆霍谢谢。 –

2

你可以看到日期相差多少午夜,过滤器上:

select * from mytable 
where date_column - trunc(date_column) < 5.5/24 

date_column - trunc(date_column)计算会给你的一小部分一天,正常为date arithmetic5.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 

不过,请注意这样的列的任何操作将阻止指数为用过的。如果你必须经常这样做,可能值得添加一个虚拟列/索引来做这个计算。

+0

似乎没有工作... –

+0

@MarcusLeon - 这不是很有帮助。当你运行它会发生什么?你有什么原始数据,你期望得到什么结果,你会得到什么? (将前两个添加到问题中可能会有用)。我刚刚检查过一些测试数据,它会在任何日期的05:30之前返回行。 –

+0

太难 to_char(date_column,'HH24:MI:SS')<'05:30:00'看起来很简单 –

0

你需要将时间转换回日期,否则你只是在做字符串比较。 Oracle并不是真的有一个聪明的方法来做到这一点。最简单的方法是将两个日期都投到同一天并进行比较。

I.e.

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