我正在尝试更新超过24小时(1天)的表中的记录。我想通过使用以下查询在Day(一天)而不是几个小时之间进行区别:
UPDATE Testing
SET STS_CD='02'
WHERE EXTRACT(DAY FROM SYSTIMESTAMP)- EXTRACT(DAY FROM UPD_DTM)> 1
现在,有些情况下我们必须检查12小时或36小时的记录。因此,我现在只需要基于小时数进行计算即可。 而且,当我试图获得基于小时数的差异时,我没有得到正确的结果。你能建议吗?
UPDATE Testing
SET STS_CD='02'
WHERE EXTRACT(HOURS FROM SYSTIMESTAMP)- EXTRACT(HOURS FROM UPD_DTM)> 24
答案 0 :(得分:0)
日期算术可以使用天数,除非您想要不同的日期。例如,如果您减去日期列和数字2(upd_dtm - 2
),则会得到“两天前”的信息。
更新日期列在过去1天(或24小时)内的行将是
UPDATE Testing
SET STS_CD = '02'
WHERE upd_dtm > sysdate - 1
或者,where upd_dtm > sysdate - 24/24
(因为一天有24小时)。
也来看看这个;将来可能会对您有所帮助:
SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi';
Session altered.
SQL> select
2 sysdate - 1 one_day_ago,
3 sysdate - 12/24 twelve_hours_ago,
4 sysdate - 36/24 thirty_six_hours_ago
5 from dual;
ONE_DAY_AGO TWELVE_HOURS_AGO THIRTY_SIX_HOURS
---------------- ---------------- ----------------
23.09.2018 09:38 23.09.2018 21:38 22.09.2018 21:38
SQL>
答案 1 :(得分:0)
如果UPD_DTM列类型为时间戳记:
UPDATE Testing
SET STS_CD='02'
WHERE extract (day from (systimestamp -UPD_DTM )) >1;
如果UPD_DTM列类型为日期:
UPDATE Testing
SET STS_CD='02'
WHERE sysdate-UPD_DTM >1;
答案 2 :(得分:0)
列UPD_DTM
似乎是TIMESTAMP
的值,在这种情况下,我建议使用
UPDATE Testing
SET STS_CD='02'
WHERE SYSTIMESTAMP - UPD_DTM > INTERVAL '1' DAY
如果您需要小时数差异,也可以使用
WHERE SYSTIMESTAMP - UPD_DTM > INTERVAL '24' HOUR
使用EXTRACT(HOURS FROM ...)
时,您只会获得小时值。
例如EXTRACT(HOUR FROM TIMESTAMP '2018-09-24 15:00:00')- EXTRACT(HOUR FROM TIMESTAMP '2018-09-22 14:00:00')
的结果仅为 1 (小时),实际上相差49小时,即2天和1小时(+02 01:00:00.000000
)
您对EXTRACT(DAY FROM SYSTIMESTAMP)- EXTRACT(DAY FROM UPD_DTM)
有类似的问题,例如EXTRACT(DAY FROM TIMESTAMP '2018-09-22 15:00:00')- EXTRACT(DAY FROM TIMESTAMP '2018-08-22 14:00:00')
返回0,尽管相差一个月!
如果您在列UPD_DTM
上有索引,那么为获得最佳性能,您应该选择
WHERE UPD_DTM < SYSTIMESTAMP - INTERVAL '1' DAY