如何查询Orace日期字段的时间部分。即:Oracle查询按时(而不是日期)
select * from mytable
where
date_column < '05:30:00'
希望查询返回由date_column表示的时间小于5:30的任何行,无论日期如何。
如何查询Orace日期字段的时间部分。即:Oracle查询按时(而不是日期)
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小时。
如果该列是时间戳而不是日期,则会看到间隔数据类型作为减法的结果。如果你喜欢,你可以使用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
不过,请注意这样的列的任何操作将阻止指数为用过的。如果你必须经常这样做,可能值得添加一个虚拟列/索引来做这个计算。
似乎没有工作... –
@MarcusLeon - 这不是很有帮助。当你运行它会发生什么?你有什么原始数据,你期望得到什么结果,你会得到什么? (将前两个添加到问题中可能会有用)。我刚刚检查过一些测试数据,它会在任何日期的05:30之前返回行。 –
太难 to_char(date_column,'HH24:MI:SS')<'05:30:00'看起来很简单 –
你需要将时间转换回日期,否则你只是在做字符串比较。 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')
这是一个日期列 –