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

How to filter query with EXTRACT statement oracle

我有这个查询,其中我得到 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

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

这是正确的方法吗?

just to be more clear, as a result I need to get the records where the difference between the dates is less than 1 day.

您可以使用:

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

编辑:

作为 @a-horse-with-no-name 在评论中你可以使用 INTERVAL:

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

为了更好的可读性。

@kordirko评论:

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

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 子句中重复使用自定义字段的一种方法。