根据日期之间的小时差更新表中的记录

时间:2018-09-24 07:24:08

标签: oracle

我正在尝试更新超过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

3 个答案:

答案 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