【问题标题】:Shift hours between two dates在两个日期之间转换时间
【发布时间】:2014-09-05 10:35:02
【问题描述】:

输入表

Start time     End Time
8/12/14 17:00  8/14/14 12:00

我需要在班次中拆分时间并显示如下输出

11:00 to 23:00    23:00 to 11:00
      19                24

计算工作

Date     11:00 to 23:00    23:00 to 11:00
8/12/14        6                1
8/13/14        12               12
8/14/14        1                11

Total          19               24

【问题讨论】:

  • 1924 来自哪里?请解释您要做什么。
  • @juergend 你能看看我更新的问题吗?
  • 这些是那个班次的次数吗?我不明白。您的原始数据是什么样的?

标签: sql datetime sql-server-2012


【解决方案1】:

您可以使用递归公用表表达式生成开始日期和结束日期之间的小时序列,然后使用 case 语句来评估它属于哪个范围,然后求和聚合:

DECLARE @T TABLE (StartTime DATETIME, EndTime DATETIME)
INSERT @T VALUES ('8/12/14 17:00', '8/14/14 12:00')

;WITH cte AS 
    (
    SELECT StartTime AS dt, EndTime
    FROM @T
    UNION  ALL
    SELECT DATEADD(MINUTE, 60, dt) AS dt, EndTime
    FROM cte
    WHERE dt < DATEADD(HOUR, -1, EndTime)
    )

SELECT 
  SUM(
    CASE 
      WHEN CAST(dt AS TIME) >= '11:00' AND CAST(dt AS TIME) < '23:00' THEN 1 
      ELSE 0 
    END) AS '11:00 to 23:00',
  SUM(
    CASE 
      WHEN CAST(dt AS TIME) >= '11:00' AND CAST(dt AS TIME) < '23:00' THEN 0 
      ELSE 1 
    END) AS '23:00 to 11:00'
FROM cte

我确信它可以改进,但它应该会给你想要的结果。

Sample SQL Fiddle

样本输出:

11:00 to 23:00 23:00 to 11:00
-------------- --------------
19             24

SQL Fiddle 以 30 分钟为间隔显示处理时间,输出为:

11:00 to 23:00 23:00 to 11:00
-------------- --------------
23.5           25.5

【讨论】:

  • 谢谢。有没有办法计算分钟呢?我的意思是时间可能是 18:30
  • @Luv 我添加了第二个小提琴,它以 30 分钟的间隔处理时间,并在输出中包含半小时,这就是你的意思吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
相关资源
最近更新 更多