我有这个查询,我得到了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
这是正确的方法吗?
答案 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)
为了更好的可读性。
此解决方案为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子句中重复使用自定义字段的方法。