SQL ORACLE,如何减去sysdate?[副本]

vs91vp4v  于 2023-06-05  发布在  Oracle
关注(0)|答案(2)|浏览(190)

此问题已在此处有答案

find the elapsed time between two dates in oracle sql(3个答案)
2天前关闭。
如何从SQL ORACLE中创建的任务日期中减去系统日期,以获得天、小时、分钟的差值?
我尝试了这个代码,但我得到了错误的值:TO_CHAR(TO_DATE('1970-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') + (sysdate - a.CREATE_DATE_PL ), 'dd:hh24:mi:ss') AS TT_LIFETIME
我的结果如下(报告已生成02.06 14:05
enter image description here

sr4lhrrt

sr4lhrrt1#

两个DATE数据类型值之差是它们之间的 * 天 * 数,所以你必须做一些算术来提取天/小时/分钟,或者-另一种选择-尝试extractnumtodsinterval
例如:

SQL> WITH
  2     test (create_date_pl)
  3     AS
  4        (SELECT TO_DATE ('01.06.2023 08:10', 'dd.mm.yyyy hh24:mi') FROM DUAL)
  5  SELECT SYSDATE,
  6         create_date_pl,
  7         --
  8         SYSDATE - create_date_pl diff,
  9         NUMTODSINTERVAL (SYSDATE - create_date_pl, 'day') c1,
 10         EXTRACT (DAY FROM NUMTODSINTERVAL (SYSDATE - create_date_pl, 'day')) cd,
 11         EXTRACT (HOUR FROM NUMTODSINTERVAL (SYSDATE - create_date_pl, 'day')) ch,
 12         EXTRACT (MINUTE FROM NUMTODSINTERVAL (SYSDATE - create_date_pl, 'day')) cm
 13    FROM test;

SYSDATE          CREATE_DATE_PL         DIFF C1                                               CD         CH         CM
---------------- ---------------- ---------- ---------------------------------------- ---------- ---------- ----------
02.06.2023 14:29 01.06.2023 08:10 1,26333333 +000000001 06:19:12.000000000                     1          6         19

SQL>

当我运行代码时,是2023年6月2日14:29。要减去的日期是2023年6月1日(昨天)08:10。

  • diff表示这两个值之间的天数
  • c1numtodsinterval返回的值
  • cdchcm包含提取的天数/小时数/分钟数,即相差1天6小时19分钟
nvbavucw

nvbavucw2#

日期和日期之间的差异是一个(分数)数字,表示它们之间的天数。然后,您可以将其乘以24以获得小时,或1440以获得分钟,或86400以获得秒。在此过程中不要使用TO_CHAR转换任何内容:

(SYSDATE - a.create_date_pl) days,
(SYSDATE - a.create_date_pl)*24 hours,
(SYSDATE - a.create_date_pl)*1440 minutes,
(SYSDATE - a.create_date_pl)*86400 seconds

然后,您可以将一个(分数)数字添加到一个日期,结果是另一个日期,原始日期偏移了您添加的天数。

SYSDATE + (a.expiration_date - a.create_date_pl) -- = another date

您也可以将DATE s转换为TIMESTAMP s,然后差异将是INTERVAL数据类型:

SYSTIMESTAMP - CAST(TO_DATE('01/01/2023','MM/DD/YYYY') AS timestamp)

结果:

+000000152 07:21:21.785258

有许多函数可用于提取音程的片段。然而,我发现在大多数情况下,处理日期是最简单的,因为将INTERVAL转换为单个数字(例如,秒的总数)并不像应该的那样简单,而DATE算法非常简单。DATE也更简单,因为它们不包括时区,这可能会让使用TIMESTAMP逻辑的程序员感到非常困惑。

相关问题