首页 > 解决方案 > 投射特定的小时和分钟并获取时差

问题描述

我有以下内容:

trunc(sysdate - to_timestamp(trunc(sysdate, 'YYYY-MM-DD') || ' 12:30', 'YYYY-MM-DD HH245:MI')  * 1440,1)

我想要做的是,使用 sysdate 的日期部分并将 12:30 转换为时间部分。然后计算 sysdate@12:30 和当前 sysdate 之间的差异。

我越来越:

ORA-00932: inconsistent datatypes: expected NUMBER got TIMESTAMP

在减号之后。

有任何想法吗?

标签: sqloracledatetime

解决方案


您收到该错误是因为您尝试将时间戳乘以 1440,而不是日期和时间戳之间的差异 - multiplication 的优先级高于 subtraction。您的格式模型中也有HH245代替HH24trunc(sysdate, 'YYYY-MM-DD')将抛出“ORA-01898: too many precision specifiers”;如果您将其更改为,to_char(sysdate, 'YYYY-MM-DD') || ...您将从一个日期中减去一个时间戳,这会给您一个间隔,而不是一个数字,并且会抛出一个不同的 ORA-00932 错误。

解决所有这些问题,您最终会得到:

trunc((sysdate - to_date(to_char(sysdate, 'YYYY-MM-DD') || ' 12:30', 'YYYY-MM-DD HH24:MI')) * 1440, 1)

目前对我来说评估为 354.2。

不过,您不需要转换为字符串或从字符串转换。您可以通过以下方式获得今天的 12:30:

trunc(sysdate) + (12.5/24)

wheretrunc(sysdate)给你今天的午夜,而 12.5/24 给你一天的一小部分,持续 12.5 小时。然后,您可以从当前时间中减去它:

sysdate - (trunc(sysdate) + (12.5/24))

要获得天数的差异,然后将该结果乘以 1440 的分钟数,并截断到一个小数位。

当前日期和今天 12:30 的快速演示以及三种方式的区别:

select sysdate,
  trunc(sysdate) + (12.5/24) as "12:30",
  sysdate - (trunc(sysdate) + (12.5/24)) as diff_days,
  (sysdate - (trunc(sysdate) + (12.5/24))) * 1440 as diff_mins,
  trunc((sysdate - (trunc(sysdate) + (12.5/24))) * 1440, 1) as result
from dual;

SYSDATE             12:30                DIFF_DAYS  DIFF_MINS     RESULT
------------------- ------------------- ---------- ---------- ----------
2019-08-14 18:24:16 2019-08-14 12:30:00 .246018519 354.266667      354.2

正如@GordonLinoff 暗示的那样,今天12:30 部分可以通过间隔而不是小数天来实现,例如:

trunc(sysdate) + 12.5 * interval '1' hour

或更简单明了:

trunc(sysdate) + interval '12:30' hour to minute

您似乎希望将最终结果作为分钟数,但您也可以通过将当前天数中间结果(或分钟数)转换为numtodsinterval()

numtodsinterval(sysdate - (trunc(sysdate) + interval '12:30' hour to minute), 'DAY')

这有点令人费解,或者直接:

select systimestamp,
  systimestamp - trunc(sysdate) - interval '12:30' hour to minute as result
from dual;

SYSTIMESTAMP                         RESULT             
------------------------------------ -------------------
2019-08-14 18:24:16.830116000 +01:00 +00 05:54:16.830116

db<>小提琴


推荐阅读