当前位置: 首页 > 面试题库 >

SQL DateDiff高级用法?

祝英博
2023-03-14
问题内容

我需要计算两个日期之间的DateDiff(小时),但仅在工作时间(8:30-16:00,无周末)期间计算。然后,根据以下示例,将该结果放入“
Reaction_Time”列中。

ID日期Reaction_Time逾期
1 29.04.2003 15:00:00                      
1 30.04.2003 11:00:00 3:30        
2 30.04.2003 14:00:00                      
2 01.05.2003 14:00:00 7:30

*注意:我没有检查示例中的日期是否为假期。

我正在使用SQL Server 2005

这将与更大的查询结合在一起,但是现在我需要的只是这个入门,我将尝试弄清楚如何将它们自己组合在一起。谢谢您的帮助!

编辑:
嘿,谢谢大家的答复。但是由于SQL端解决方案的明显复杂性,决定我们将在Excel中执行此操作,因为无论如何该位置都将移动报告。抱歉给您带来麻烦,但我真的认为这比这要简单。就这样,我们只是没有时间。


问题答案:

DECLARE @BusHourStart DATETIME, @BusHourEnd DATETIME
SELECT @BusHourStart = ‘08:30:00’, @BusHourEnd = ‘16:00:00’
DECLARE @BusMinutesStart INT, @BusMinutesEnd INT
SELECT @BusMinutesStart = DATEPART(minute,@BusHourStart)+DATEPART(hour,@BusHourStart)60,
@BusMinutesEnd = DATEPART(minute,@BusHourEnd)+DATEPART(hour,@BusHourEnd)
60
DECLARE @Dates2 TABLE (ID INT, DateStart DATETIME, DateEnd DATETIME)
INSERT INTO @Dates2
SELECT 1, ‘15:00:00 04/29/2003’, ‘11:00:00 04/30/2003’ UNION
SELECT 2, ‘14:00:00 04/30/2003’, ‘14:00:00 05/01/2003’ UNION
SELECT 3, ‘14:00:00 05/02/2003’, ‘14:00:00 05/06/2003’ UNION
SELECT 4, ‘14:00:00 05/02/2003’, ‘14:00:00 05/04/2003’ UNION
SELECT 5, ‘07:00:00 05/02/2003’, ‘14:00:00 05/02/2003’ UNION
SELECT 6, ‘14:00:00 05/02/2003’, ‘23:00:00 05/02/2003’ UNION
SELECT 7, ‘07:00:00 05/02/2003’, ‘08:00:00 05/02/2003’ UNION
SELECT 8, ‘22:00:00 05/02/2003’, ‘23:00:00 05/03/2003’ UNION
SELECT 9, ‘08:00:00 05/03/2003’, ‘23:00:00 05/04/2003’ UNION
SELECT 10, ‘07:00:00 05/02/2003’, ‘23:00:00 05/02/2003’

-- SET DATEFIRST to U.S. English default value of 7.
SET DATEFIRST 7

SELECT ID, DateStart, DateEnd, CONVERT(VARCHAR, Minutes/60) +':'+ CONVERT(VARCHAR, Minutes % 60) AS ReactionTime
FROM ( 
    SELECT ID, DateStart, DateEnd, Overtime,
        CASE 
            WHEN DayDiff = 0 THEN 
                CASE 
                    WHEN (MinutesEnd - MinutesStart - Overtime) > 0 THEN (MinutesEnd - MinutesStart - Overtime) 
                    ELSE 0 
                    END
            WHEN DayDiff > 0  THEN 
                CASE 
                    WHEN (StartPart + EndPart - Overtime) > 0 THEN (StartPart + EndPart - Overtime) 
                    ELSE 0 
                    END + DayPart
            ELSE 0
        END AS Minutes 
    FROM(
        SELECT ID, DateStart, DateEnd, DayDiff, MinutesStart, MinutesEnd,
                CASE WHEN(@BusMinutesStart - MinutesStart) > 0 THEN (@BusMinutesStart - MinutesStart) ELSE 0 END +
                CASE WHEN(MinutesEnd - @BusMinutesEnd) > 0 THEN (MinutesEnd - @BusMinutesEnd) ELSE 0 END AS Overtime, 
                CASE WHEN(@BusMinutesEnd - MinutesStart) > 0 THEN (@BusMinutesEnd - MinutesStart) ELSE 0 END AS StartPart,
                CASE WHEN(MinutesEnd - @BusMinutesStart) > 0 THEN (MinutesEnd - @BusMinutesStart) ELSE 0 END AS EndPart,
                CASE WHEN DayDiff > 1 THEN (@BusMinutesEnd - @BusMinutesStart)*(DayDiff - 1) ELSE 0 END AS DayPart
        FROM (
                SELECT DATEDIFF(d,DateStart, DateEnd) AS DayDiff, ID, DateStart, DateEnd,  
                DATEPART(minute,DateStart)+DATEPART(hour,DateStart)*60 AS MinutesStart,
                DATEPART(minute,DateEnd)+DATEPART(hour,DateEnd)*60 AS MinutesEnd 
                FROM (
                        SELECT ID,
                                CASE 
                                        WHEN DATEPART(dw, DateStart) = 7 
                                        THEN DATEADD(SECOND, 1, DATEADD(DAY, DATEDIFF(DAY, 0, DateStart), 2))
                                        WHEN DATEPART(dw, DateStart) = 1 
                                        THEN DATEADD(SECOND, 1, DATEADD(DAY, DATEDIFF(DAY, 0, DateStart), 1))
                                ELSE DateStart END AS DateStart,
                                CASE 
                                        WHEN DATEPART(dw, DateEnd) = 7 
                                        THEN DATEADD(SECOND, -1, DATEADD(DAY, DATEDIFF(DAY, 0, DateEnd), 0))
                                        WHEN DATEPART(dw, DateEnd) = 1 
                                        THEN DATEADD(SECOND, -1, DATEADD(DAY, DATEDIFF(DAY, 0, DateEnd), -1))
                                ELSE DateEnd END AS DateEnd FROM @Dates2
                )Weekends
        )InMinutes
    )Overtime
)Calculation


 类似资料:
  • 动态路由 跳转前确认 服务端渲染 模块生命周期 组件外部跳转

  • ASN.1 和 SNMP 什么是ASN.1 ? 注意:这只是我对ASN.1的个人观点,我会尽可能的做简单的解释。至于更多的理论或者学术观点,我相信你会在互联网上找到更好的。 ASN.1(抽象语法标记)是一种对数据进行表示、编码、传输和解码的数据格式。它用一种独立的方式给数据编码,用指定的编码规则给数据编码。 最常用的编码规则是BER(基本编码规则)和DER(识别名编码规则),两者看起来是一样的,但

  • 本篇文档涵盖了 Requests 的一些高级特性。 会话对象 会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling 功能。所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。 (参见 HTTP persistent connection

  • 函数 属性值可通过传递一个函数来设置动画效果 // 使 $element 的透明度随机到一个值 的动画,每次执行后 元素透明度都不同 $element.velocity({ opacity: function() { return Math.random() } }); <button id="btn">开始运动</button> <button id="reset">还原</bu

  • 服务即是被注入到处理器中的参数. 你可以映射一个服务到 全局 或者 请求 的级别. 全局映射 因为 Macaron 实现了 inject.Injector 的接口, 那么映射一个服务就变得非常简单: db := &MyDatabase{} m := macaron.Classic() m.Map(db) // Service will be available to all handlers as

  • 除了可以对实现了Runnable接口的java类进行调度以外,还可以直接调度外部的应用程序,例如windows或linux下的某个可执行程序,如下是代码示例: String[] command = { "C:\\tomcat\\bin\\catalina.bat", "start" }; String[] envs = { "CATALINA_HOME=C:\\tomcat", "JAVA_HOM

  • 错误处理 {#eh} 执行任何操作后,如果发生任何错误,GORM将其设置为*DB的Error字段 if err := db.Where("name = ?", "jinzhu").First(&user).Error; err != nil { // 错误处理... } // 如果有多个错误发生,用`GetErrors`获取所有的错误,它返回`[]error` db.First(&user

  • 高级使用 静态资源映射表 记录文件依赖、打包、URL等信息的表结构,在 FIS2 中统称 map.json。在 FIS3 中默认不产出 map.json,FIS3 中为了方便各种语言下读取 map.json,对产出 map.json 做了优化。 当某个文件包含字符 __RESOURCE_MAP__,就会用表结构数据替换此字符。这样的好处是不再固定把表结构写入某一个特定文件,方便定制。 比如在 ph