【问题标题】:Oracle query on time (and not date)Oracle 按时查询(而不是日期)
【发布时间】:2016-08-07 11:46:41
【问题描述】:

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

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

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

【问题讨论】:

  • 这是一个日期列

标签: sql oracle date datetime


【解决方案1】:

你可以这样试试:

select * from mytable 
where 
to_char( date_column, 'HH24:MI:SS' ) < '05:30:00'

【讨论】:

  • alex 的回答也有效,但这是最容易理解的,恕我直言。
  • 请记住,您所做的是字符串比较,而不是时间或日期。只要您使用 24 小时格式,字符串比较应该可以工作。
【解决方案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 小时。

如果该列是时间戳而不是日期,您会看到一个区间数据类型作为减法的结果。如果您喜欢或发现它比 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

请注意,像这样对列的任何操作都会阻止使用索引。如果您必须定期执行此操作,则可能值得添加一个虚拟列/索引来执行该计算。

【讨论】:

  • @MarcusLeon - 这不是很有帮助。当你运行它时会发生什么?你有什么原始数据,你期望什么结果,你得到什么? (将前两个添加到问题中可能会有用)。我刚刚检查了一些测试数据,它带回了任何日期时间在 05:30 之前的行。
  • to_char(date_column, 'HH24:MI:SS')
  • @PavelZimogorov - 不知道为什么很难,这只是简单的数学。字符串比较让我感到紧张,尽管使用 HH24 掩码是安全的。
【解决方案3】:

您需要将时间转换回日期,否则您只是在进行字符串比较。 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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-27
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2021-07-24
    相关资源
    最近更新 更多