Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 两个日期(在特定时间范围内)之间经过的时间_Sql_Oracle_Date_Oracle11g - Fatal编程技术网

Sql 两个日期(在特定时间范围内)之间经过的时间

Sql 两个日期(在特定时间范围内)之间经过的时间,sql,oracle,date,oracle11g,Sql,Oracle,Date,Oracle11g,我正在创建一个查询,显示两个日期之间经过的时间,只考虑周一到周五08:00到17:00的时间,例如: 例如,如果请愿书在第一天下午6:30开始,在第二天晚上8:45结束,则TMO为45分钟。 如果第三天8:45关闭,TMO为9小时45分 例2: 如果请愿书在周五16:45开始,周二8:30结束,MTO将是:周五15分钟,周一9小时,周二30分钟,MTO=9小时45分钟 查询是在date类型的单个列上执行的,如下所示 我目前使用滞后函数进行查询,但我无法创建功能性的、甚至不是最佳的查询,我将非常感

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

例如,如果请愿书在第一天下午6:30开始,在第二天晚上8:45结束,则TMO为45分钟。 如果第三天8:45关闭,TMO为9小时45分

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

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


我目前使用滞后函数进行查询,但我无法创建功能性的、甚至不是最佳的查询,我将非常感谢您的帮助。

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

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

要将日期截断为一天的开始,我们使用TRUNCdt。截短到星期一的开始,TRUNCdt,“iw”

要计算从日期dt开始到一天中的实际时间的工作小时数,我们可以使用该计算

greatest(0, least(17/24, dt - trunc(dt)) - 8/24)
结果将在几天内公布;我们用天来计算一切,然后我们可以换算成小时。然而,在最后的公式中,我们必须检查日期是星期六还是星期天,在这种情况下,它应该是零。或者,更好的是,我们可以稍后调整计算,当我们从周一开始计算时,我们可以使用至少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

这两个日期是什么?我看到一个约会。或者一个有很多日期的专栏。为什么滞后与你的问题有关?每个日期是否都是关闭一个申请和打开另一个申请的时间?第一个日期是前一行,第二个日期是它所在的行。也就是说,使用单个列显示us db模式、样本数据、当前和预期输出。请阅读,这里是学习如何提高问题质量和获得更好答案的好地方。尝试在“非常感谢”中创建一个示例,它工作得非常完美,我只需将其合并,非常感谢请确保使用各种输入对其进行测试;因为您没有以可用的形式提供输入,比如CREATETABLE和INSERT语句,或者WITH子句,所以我自己很少进行测试。我可以保证这种方法是正确的,但我已经在本周开始的整整几天里修正了计算中的一个错误,当我第一次发布答案时,我忘记了乘以9/24,而这恰好对我构建的单个测试用例没有不良影响,因为开始和结束是一周中的同一天!我准备了一组场景,因为我已经做了一段时间了,我已经尝试了所有的场景,结果是预期的,非常感谢@mathguy