如何仅按时间部分比较日期时间列

时间:2019-08-28 12:09:16

标签: sql oracle

我需要编写SQL查询,该查询将为我提供datetime值Creation_date的日期与datetime值Status_date的日期相同的所有行。另外,此datetime值的时间部分必须在此查询的where子句中-值Status_date的确切时间部分必须在值Creation_date的时间部分和凌晨4点之间,也应是Creation_date需要从午夜到凌晨2点。

我想我知道第一部分

select *
from a_orders
where trunc(Creation_date)=trunc(Status_date) and ??

表格:

      Creation_date         Status_date  
1.2019-08-26 00:02:10   2019-08-26 08:35:02
2.2019-08-26 00:02:20   2019-08-26 09:15:18
3.**2019-08-26 00:02:41 2019-08-26 00:20:08**
4.**2019-08-26 00:02:48 2019-08-26 00:20:08**
5.2019-07-29 00:05:28   2019-07-30 00:40:29

在上表中,我只需要第3和4.行即可。

预先感谢!

2 个答案:

答案 0 :(得分:1)

查询时间有点长,但是如果您使用的是Oracle,请尝试此操作,看看它是否有效

where trunc(Creation_date)=trunc(Status_date) 
and Creation_date between to_date(to_char(d.Creation_date,'MM/DD/YYYY') || ' 00:00','MM/DD/YYYY HH24:MI') and to_date(to_char(d.Creation_date,'MM/DD/YYYY') || ' 02:00','MM/DD/YYYY HH24:MI')
and Status_date between d.Creation_date and to_date(to_char(d.Creation_date,'MM/DD/YYYY') || ' 04:00','MM/DD/YYYY HH24:MI');

答案 1 :(得分:0)

由于您使用了TRUNC函数,所以我想我们正在谈论Oracle,并且列的类型为DATETIMESTAMP

  

Creation_date必须是从午夜到凌晨2点:

Creation_date - TRUNC(Creation_date) <= 2/24
  

状态日期必须在值Creation_date的时间部分之间   和4AM:

Status_date BETWEEN Creation_date AND (TRUNC(Status_date) + 4/24)

后者是因为您之前检查过两个日期具有相同的日期部分。