计算两个日期之间的秒数并进行分类

时间:2014-10-09 08:45:42

标签: database sql-server-2008 tsql

我有一个问题需要使用SQL来解决。问题是我必须计算日期与工作时间之间的秒数,工作时间以外的工作时数以及周末的工作时数。工作时间在0800到1600之间。某种功能应该可以做到这一点,但我无法解决这个问题。谁能帮我?

示例数据(SQL Server 2008 R2 SP2):

Opendate:2014-10-01 10:33:57.767 闭幕:2014-10-09 10:33:52.733

1 个答案:

答案 0 :(得分:0)

我使用这些函数返回两个日期之间的非周末秒:

CREATE FUNCTION [dbo].[DateDiff_NoWeekends](
    @date1 DATETIME,
    @date2 DATETIME
)

RETURNS INT AS BEGIN
    DECLARE @retValue INT

    SET @date1 = dbo.__CorrectDate(@date1, 1)
    SET @date2 = dbo.__CorrectDate(@date2, 0)

    IF (@date1 >= @date2)
        SET @retValue = 0
    ELSE BEGIN
        DECLARE @days INT, @weekday INT
        SET @days = DATEDIFF(d, @date1, @date2)
        SET @weekday = DATEPART(dw, @date1) - 1

        SET @retValue = DATEDIFF(s, @date1, @date2) - 2 * 24 * 3600 * ((@days + @weekday) / 7) 
    END

    RETURN @retValue
END

GO


CREATE FUNCTION [dbo].[__CorrectDate](
    @date DATETIME,
    @forward INT
)

RETURNS DATETIME AS BEGIN
    IF (DATEPART(dw, @date) > 5) BEGIN

        IF (@forward = 1) BEGIN
            SET @date = @date + (8 - DATEPART(dw, @date))
            SET @date = DateAdd(Hour, (8 - DatePart(Hour, @date)), @date)
        END ELSE BEGIN
            SET @date = @date - (DATEPART(dw, @date)- 5)
            SET @date = DateAdd(Hour, (18 - DatePart(Hour, @date)), @date)
        END
        SET @date = DateAdd(Minute, -DatePart(Minute, @date), @date)
        SET @date = DateAdd(Second, -DatePart(Second, @date), @date)
    END

    RETURN @date
END

这应该有助于开始找到其他任务的解决方案。

这里有sql-fiddle demo个样本数据:

SELECT [weekday-seconds between] =
    (dbo.DateDiff_NoWeekends('2014-10-01 10:33:57.767','2014-10-09 10:33:52.733'))

=> 518395