【问题标题】:How to get the time difference in hours between 2 dates where dates are stored in 12 hour format in Oracle?如何在 Oracle 中以 12 小时格式存储日期的 2 个日期之间的小时时差?
【发布时间】: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 值存储为字符串?

标签: sql oracle date datetime oracle10g


【解决方案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
猜你喜欢
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 2010-10-01
相关资源
最近更新 更多