SQL-datediff(分钟)不包括周末

SQL-datediff(分钟)不包括周末,sql,sql-server,datediff,Sql,Sql Server,Datediff,你能帮助我吗,我正在使用下面的sql视图,然后我在crystal reports中使用它。我需要以分钟为单位的日期差异,但现在我需要排除周末。 请帮助: SELECT intwc AS wc, Datediff(n, start_date, end_date) AS time, mh_start_date AS date, 'Repair'

你能帮助我吗,我正在使用下面的sql视图,然后我在crystal reports中使用它。我需要以分钟为单位的日期差异,但现在我需要排除周末。 请帮助:

SELECT intwc                             AS wc,
       Datediff(n, start_date, end_date) AS time,
       mh_start_date                     AS date,
       'Repair'                          AS type
FROM   dbo.xxxxxxx 

此答案假设您希望以分钟为单位排除周末,并且它完全基于中的答案:


因此,您确实需要能够处理一些CASE语句来处理所有的边缘情况。下面是我总结的一个例子。数字表只是一个计数表,在本例中是1到30

CREATE TABLE #times (id INT IDENTITY(1,1), start_stamp DATETIME, end_stamp DATETIME)

INSERT INTO #times
        ( 
          start_stamp ,
          end_stamp
        )
SELECT DATEADD(DAY, -2*Number, CURRENT_TIMESTAMP), DATEADD(DAY, -1*Number, CURRENT_TIMESTAMP)
FROM Common.NUMBERS
WHERE Number < 31

SELECT id, start_stamp, end_stamp,
CASE WHEN DATEDIFF(DAY, start_stamp, end_stamp) < 7 THEN
    CASE WHEN DATEPART(weekday, start_stamp) < DATEPART(weekday, end_stamp)
        THEN DATEDIFF(MINUTE, start_stamp, DATEADD(HOUR, -48, end_stamp))
        ELSE DATEDIFF(MINUTE, start_stamp, end_stamp) END
    ELSE DATEDIFF(MINUTE, start_stamp, DATEADD(HOUR, -48*(DATEDIFF(WEEK, start_stamp, end_stamp)), end_stamp)) END
    + CASE WHEN DATENAME(weekday,start_stamp) IN ('Sunday', 'Saturday') THEN 1440 ELSE 0 END
    + CASE WHEN DATENAME(weekday,end_stamp) IN ('Sunday', 'Saturday') THEN 1440 ELSE 0 END
FROM #times

也许有一种更优雅的方法可以做到这一点,但代码允许您针对整个结果集运行,并计算每行数据。

这是@bendataclear答案的修改版本。它直接计算周末分钟数,而不是计算天数并乘以24*60。它还说明了周六/周日开始/结束的所有4种组合

我使用CONVERTdate、@StartDate获取@StartDate的日期,时间为00:00:00,然后用于计算部分星期日和星期六。做那件事有很多方法,但我选择了最简单的方法

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2013/03/15 23:30:00'
SET @EndDate = '2013/03/17 00:30:00'


SELECT
(   DATEDIFF(MINUTE, @StartDate, @EndDate)
    - ( DATEDIFF(wk, @StartDate,@EndDate)*(2*24*60)
        -- End on Sunday
        -(CASE WHEN DATEPART(dw, @EndDate)  = 1 THEN 24.0*60-DATEDIFF(minute,CONVERT(date,@EndDate),@EndDate) ELSE 0 END)
        -- Start on Saturday
        -(CASE WHEN DATEPART(dw, @StartDate) = 7 THEN DATEDIFF(minute,CONVERT(date,@StartDate),@StartDate) ELSE 0 END)
        -- End on Saturday
        +(CASE WHEN DATEPART(dw, @EndDate)  = 7 THEN DATEDIFF(minute,CONVERT(date,@EndDate),@EndDate) ELSE 0 END)
        -- Start on Saturday
        +(CASE WHEN DATEPART(dw, @StartDate) = 1 THEN 24.0*60-DATEDIFF(minute,CONVERT(date,@StartDate),@StartDate) ELSE 0 END)
    )
)

你用的是什么数据库管理系统?可能是重复的只是为了确认,对于周五晚上11:30和周一上午12:30之间的差异,你想看60分钟吗?bendataclear-是的,绝对我不认为“计算两个工作日之间的时间”与这个问题很匹配。无论开始日期或结束日期是什么时间,最后两行将减去整个24*60分钟。但是,如果EndDate是周六的0:30,那么应该减去的时间只有30分钟,而不是24*60分钟。在代码中,尝试将EndDate更改为“2013/03/17 00:30:00”,它将给出一个负数。对于额外的分数,/60此答案乘以60将给出两个日期之间的总小时数,%60将给出总分钟数。结果被四舍五入
CREATE TABLE #times (id INT IDENTITY(1,1), start_stamp DATETIME, end_stamp DATETIME)

INSERT INTO #times
        ( 
          start_stamp ,
          end_stamp
        )
SELECT DATEADD(DAY, -2*Number, CURRENT_TIMESTAMP), DATEADD(DAY, -1*Number, CURRENT_TIMESTAMP)
FROM Common.NUMBERS
WHERE Number < 31

SELECT id, start_stamp, end_stamp,
CASE WHEN DATEDIFF(DAY, start_stamp, end_stamp) < 7 THEN
    CASE WHEN DATEPART(weekday, start_stamp) < DATEPART(weekday, end_stamp)
        THEN DATEDIFF(MINUTE, start_stamp, DATEADD(HOUR, -48, end_stamp))
        ELSE DATEDIFF(MINUTE, start_stamp, end_stamp) END
    ELSE DATEDIFF(MINUTE, start_stamp, DATEADD(HOUR, -48*(DATEDIFF(WEEK, start_stamp, end_stamp)), end_stamp)) END
    + CASE WHEN DATENAME(weekday,start_stamp) IN ('Sunday', 'Saturday') THEN 1440 ELSE 0 END
    + CASE WHEN DATENAME(weekday,end_stamp) IN ('Sunday', 'Saturday') THEN 1440 ELSE 0 END
FROM #times
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2013/03/15 23:30:00'
SET @EndDate = '2013/03/17 00:30:00'


SELECT
(   DATEDIFF(MINUTE, @StartDate, @EndDate)
    - ( DATEDIFF(wk, @StartDate,@EndDate)*(2*24*60)
        -- End on Sunday
        -(CASE WHEN DATEPART(dw, @EndDate)  = 1 THEN 24.0*60-DATEDIFF(minute,CONVERT(date,@EndDate),@EndDate) ELSE 0 END)
        -- Start on Saturday
        -(CASE WHEN DATEPART(dw, @StartDate) = 7 THEN DATEDIFF(minute,CONVERT(date,@StartDate),@StartDate) ELSE 0 END)
        -- End on Saturday
        +(CASE WHEN DATEPART(dw, @EndDate)  = 7 THEN DATEDIFF(minute,CONVERT(date,@EndDate),@EndDate) ELSE 0 END)
        -- Start on Saturday
        +(CASE WHEN DATEPART(dw, @StartDate) = 1 THEN 24.0*60-DATEDIFF(minute,CONVERT(date,@StartDate),@StartDate) ELSE 0 END)
    )
)