如何使用 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 子句中重复使用自定义字段的一种方法。
我有这个查询,其中我得到 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 子句中重复使用自定义字段的一种方法。