【问题标题】:Time elapsed between two dates (In a specific time range) ORACLE两个日期之间经过的时间(在特定时间范围内)ORACLE
【发布时间】:2018-04-15 11:32:21
【问题描述】:

我正在创建一个查询,显示两个日期之间经过的时间,仅考虑周一至周五 08:00 至 17:00 之间的时间,例如:

例如,如果请愿书在第 1 天下午 6:30 开始。并在第 2 天晚上 8:45 关闭,TMO 为 45 分钟。 如果它在第 3 天 8:45 关闭,则 TMO 为 9 小时 45 分钟。

示例 2: 如果请愿书周五 16:45 开始,周二 8:30 结束,则 MTO 为:周五 15 分钟,周一 9 小时,周二 30 分钟,MTO = 9 小时 45 分钟

查询是在日期类型的单个列上执行的,如下所示

我目前使用 LAG 函数进行查询,但我无法创建功能性的东西,甚至不是最佳的合并,非常感谢您的帮助。

【问题讨论】:

  • 这两个日期是什么时候?我看到一个日期。 . .或包含许多日期的列。
  • 为什么 LAG 与您的问题有关?每个 date_time 是否是一个请愿的结束和另一个请愿的开始?
  • 第一个日期是上一行,第二个日期是它所在的行
  • 即使用单列
  • 向我们展示数据库架构、示例数据、当前和预期输出。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。 How to create a Minimal, Complete, and Verifiable example 尝试在rextester.com 中创建样本

标签: sql oracle date oracle11g


【解决方案1】:

在下面的解决方案中,我将忽略您问题的“滞后”部分,您说您知道如何使用它。我只展示了如何计算任意两个 date_times 之间的“工作时间”(它们可能在工作时间期间或之前或之后,和/或它们可以在周末;计算在所有情况下都是相同的)。

用文字解释答案:对于两个给定的日期时间,“开始”和“结束”,计算从一周开始(从星期一 00:00:00)到每个他们。这实际上是一个日期的计算,而不是两个日期的计算。然后:给定“开始”和“结束”,计算每个小时的小时数;从“开始”小时数中减去“结束”小时数。将结果加上 x 乘以 5 乘以 9,其中 x 是两个日期的星期一 00:00:00 之间的周差。 (如果他们在同一周,则差异为0。)

要将日期截断到一天的开始,我们使用TRUNC(dt)。要截断到星期一的开头,TRUNC(dt, 'iw')

要计算从日期dt 开始到实际时间的“工作”小时数,我们可以使用计算方法

greatest(0, least(17/24, dt - trunc(dt)) - 8/24)

(结果将以天为单位;我们以天为单位计算所有内容,然后我们可以转换为小时)。但是,在最终公式中,我们必须检查日期是星期六还是星期日,在这种情况下,它应该为零。或者,更好的是,我们可以稍后调整计算,从星期一开始计算(我们可以使用least( 5*9/24, ...))。

把所有东西放在一起:

with
  inputs ( dt1, dt2 ) as (
    select to_date('2017-09-25 11:30:00', 'yyyy-mm-dd hh24:mi:ss'),
           to_date('2017-10-01 22:45:00', 'yyyy-mm-dd hh24:mi:ss')
    from   dual
  )
-- End of SIMULATED input dates (for testing only).
select 24 *
     ( least(5 * (17 - 8) / 24, greatest(0, least(17/24, dt2 - trunc(dt2)) - 8/24)
                                + (17 - 8) / 24 * (trunc(dt2) - trunc(dt2, 'iw'))) 
       -
       least(5 * (17 - 8) / 24, greatest(0, least(17/24, dt1 - trunc(dt1)) - 8/24)
                                + (17 - 8) / 24 * (trunc(dt1) - trunc(dt1, 'iw'))) 
       + 5 * (17 - 8) / 24 * (trunc(dt2, 'iw') - trunc(dt1, 'iw')) / 7
     )
       as duration_in_hours
from   inputs
;


DURATION_IN_HOURS
-----------------
           41.500

【讨论】:

  • 非常感谢,它工作得很好,我能整合它的东西很少,真的谢谢
  • 请确保使用各种输入对其进行测试;因为您没有提供可用形式的输入(CREATE TABLE 和 INSERT 语句,或 WITH 子句),所以我自己做的测试很少。我可以保证该方法是正确的,但我已经修复了计算中的一个错误(从一周开始的整整几天,当我第一次发布答案时,我忘记乘以 9/24 - 它只是碰巧有对我构建的单个测试用例没有不良影响,因为开始和结束是一周中的同一天!)
  • 我准备了一组场景,因为我已经使用了一段时间,我都尝试了它们,结果是预期的,非常感谢@mathguy
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 2013-12-06
相关资源
最近更新 更多