如何使用EXTRACT语句oracle过滤查询

时间:2015-11-29 14:15:23

标签: sql oracle extract

我有这个查询,我得到了SYSDATE和一些日期列之间的区别。我需要在此查询中添加另一个过滤器来过滤DAY = 0的记录。是否可能?

SELECT REQUEST_ID,MIG_STATUS,
 EXTRACT(Day FROM( sysdate - START_DATE ) DAY TO SECOND) as Day,
 EXTRACT(HOUR FROM( sysdate - START_DATE) DAY TO SECOND) as Hour,
 EXTRACT(Minute FROM(sysdate -  START_DATE) DAY TO SECOND) as Minute,
 EXTRACT(SECOND FROM(sysdate - START_DATE) DAY TO SECOND) as Second
 FROM NET_MIG

结果:

T1_ID  DAY   HOUR   MINUTE  SECOND
1      2,817 12     12      8
2      2,817 8      26      32
3      0     1      0       0
3      1     8      26      32
3      0     13     0       0
3      0     0      59      0
3      0     0      59      0

需要添加过滤器 其中Day = 0

这是正确的方法吗?

2 个答案:

答案 0 :(得分:2)

  

只是为了更清楚,因此我需要获取记录所在的位置   日期之间的差异小于1天。

您可以使用:

SELECT REQUEST_ID,MIG_STATUS
      -- rest of columns
FROM NET_MIG
WHERE START_DATE >= (SYSDATE - 1);

如果您想要上一个5 minutes的记录,请使用:

SELECT REQUEST_ID,MIG_STATUS
      -- rest of columns
FROM NET_MIG
WHERE START_DATE >= (SYSDATE - 5 * 1/(24 * 60));

1 hour

相同
WHERE START_DATE >= (SYSDATE - 1/24);

修改

评论中的documentation,您可以使用INTERVAL

WHERE START_DATE >= (SYSDATE - INTERVAL '5' MINUTE)

为了更好的可读性。

@a-horse-with-no-name评论:

此解决方案为SARG-able。这意味着如果存在任何索引,它将使用START_DATE上的索引,其中EXTRACT(Day FROM( sysdate - START_DATE ) DAY TO SECOND) = 0将跳过该列的索引并强制执行全表扫描。

答案 1 :(得分:0)

SELECT * FROM 
  (SELECT REQUEST_ID,MIG_STATUS,
    EXTRACT(Day FROM( sysdate - START_DATE ) DAY TO SECOND) as Day,
    EXTRACT(HOUR FROM( sysdate - START_DATE) DAY TO SECOND) as Hour,
    EXTRACT(Minute FROM(sysdate -  START_DATE) DAY TO SECOND) as Minute,
    EXTRACT(SECOND FROM(sysdate - START_DATE) DAY TO SECOND) as Second
  FROM NET_MIG)
WHERE Day=0

我不确定这是最好的方法,因为您应尽可能使用直接日期比较,但这是一种可以在where子句中重复使用自定义字段的方法。