如何在 Oracle 中以 12 小时格式存储日期的 2 个日期之间的小时时差?

Posted

技术标签:

【中文标题】如何在 Oracle 中以 12 小时格式存储日期的 2 个日期之间的小时时差?【英文标题】:How to get the time difference in hours between 2 dates where dates are stored in 12 hour format in Oracle? 【发布时间】:2020-04-08 18:01:36 【问题描述】:

我有两个日期:Date1:​​20-Mar-2020 07:35:00 PM 和 Date2:20-Mar-2020 02:42:00 PM

我已经写了查询:

SELECT     ROUND(minutes / 60, 2) || ' Hours ' 
FROM     ( SELECT  (Date1 - to_date(Date2, 'DD-MON-YYYY HH12:MI:SS')) * 24 * 60     AS minutes
  FROM     dual
);

但我没有得到想要的结果,它显示 19.58 小时,这是错误的,请纠正我哪里错了?

【问题讨论】:

保持一致,转换所有日期。 刚查了一下,date1和date2的数据类型是什么? 如果他们是varchar2,你的nls_date_format 设置是什么? 到底为什么要将DATE 值存储为字符串? 【参考方案1】:

正如 Mat 所说,您需要将两个字符串都转换为日期,然后减去它们:

to_date(date1, 'dd-mon-yyyy hh12:mi:ss am') - to_date(date2, 'dd-mon-yyyy hh12:mi:ss am')

请注意,您的格式说明符缺少 am 部分。

这会给你一个十进制天数的结果,然后你可以通过将它乘以 24 来转换小时数:

round(
    ( 
        to_date(date1, 'dd-mon-yyyy hh12:mi:ss am') 
        - to_date(date2, 'dd-mon-yyyy hh12:mi:ss am')
    ) * 24, 
    2
) || ' hours'

Demo on DB Fiddle

select round(
    (
        to_date('20-Mar-2020 07:35:00 PM', 'dd-mon-yyyy hh12:mi:ss am') 
        - to_date('20-Mar-2020 02:42:00 PM', 'dd-mon-yyyy hh12:mi:ss am')
    ) * 24, 
    2
) || ' hours' res
from dual
|资源 | | :--------- | | 4.88 小时 |

【讨论】:

最后一个疑问,你能告诉我在添加日期列和数字列以形成时间戳后形成的列的数据类型是什么,例如,这里 TRAIN_START_DATE 是一个日期类型列,ACTUAL_ARRIVAL_TIME 是一个数字类型列,结果我有一个时间戳值 TRAIN_START_DATE+ACTUAL_ARRIVAL_TIME/1440) AS ARRIVAL_DATE

以上是关于如何在 Oracle 中以 12 小时格式存储日期的 2 个日期之间的小时时差?的主要内容,如果未能解决你的问题,请参考以下文章

如何在oracle中以dd / mm / yyyy格式将当前日期插入DATE字段

如何在 mongodb php 中以 ISODATE 格式存储当前日期和时间?

Oracle DB 中的日期时间格式不正确,转换为小时和分钟

Oracle 如何将“26-9月 -17 06.46.00.000000000 下午”字符串转换成标准日期格式

oracle中怎么得到日期相减除去周末后的天数

oracle中如何转换时间格式