Sql server SQL Server:如何使用datediff排除周末?

Sql server SQL Server:如何使用datediff排除周末?,sql-server,ssms,datediff,Sql Server,Ssms,Datediff,我还在学习SQL,所以请记住这一点。我有一个查询,返回特定范围内的平均天数,尽管我的范围不包括周末和假日。假期可能有点棘手,但如何将周末排除在我的范围之外 例如,我有一个范围02-01-18到02-15-18,其中datediff是14天,但是如何让SQL识别该范围内的哪些天是周末,以及它们是否要从我的datediff中排除 我的问题是 SELECT AVG(1.00 * DATEDIFF(DAY, xx, yy)) AS DayDiff FROM datebase1.dbo.

我还在学习SQL,所以请记住这一点。我有一个查询,返回特定范围内的平均天数,尽管我的范围不包括周末和假日。假期可能有点棘手,但如何将周末排除在我的范围之外

例如,我有一个范围02-01-18到02-15-18,其中datediff是14天,但是如何让SQL识别该范围内的哪些天是周末,以及它们是否要从我的datediff中排除

我的问题是

SELECT
    AVG(1.00 * DATEDIFF(DAY, xx, yy)) AS DayDiff
FROM 
    datebase1.dbo.table1
WHERE
    MONTH(datecompleted) = MONTH(DATEADD(month, -1, current_timestamp))
    AND YEAR(datecompleted) = YEAR(DATEADD(month, -1, current_timestamp))
    AND ApprovalRequiredFrom = 'pp'
我有一个日历我可以来源,告诉我日期和一天的名字,但我想避免这样做。我希望能够将周末排除在我的范围之外,以获得更准确的结果


谢谢

要排除周末,您需要从比较日期xx和yy中筛选周六和周日。为此,可以使用DATEPART函数和WEEKDAY参数。结果是一个从1到7的数字,表示一周中的哪一天

-- 2018-01-01 is a monday
SELECT DATEPART(WEEKDAY, '2018-01-01')
-- Result: 2
问题是,不同的数据库配置更改了与值1相关的日期,因此,可能第1周的某一天对某些人来说是星期天,而对其他人来说是星期一。要统一这一点,可以使用SET DATEFIRST更改默认值

另一个与datefirst无关的解决方案是直接在表达式上使用@datefirst会话值。@DATEFIRST保存我们在set-DATEFIRST语句中设置的值,或数据库默认值。请注意,结果是相同的,甚至更改日期优先

例如,您需要将xx和yy日期筛选为非周末。在WHERE子句中添加以下内容:


因为需要使用旧的MySQL 5.1服务器,所以有机会尝试一种数学方法来计算要减去的SAT/SUN数量:

注意:MySQL的weekday函数对于Mon返回0,对于SAT返回5,对于SUN返回6,因此您可以看到下面的SQL有一些神奇的数字5和6

样本:

select  floor((datediff (ed, st)+1) / 7)*2 /*complete week's weekends*/
        + case when floor((datediff (ed, st) +1) % 7) between 0 and 6 /*additional weekends besides complete weeks*/
                then case when weekday(ed) >= weekday(st) then least(floor((datediff (ed, st) +1) % 7), greatest(least(6, weekday(ed)) - greatest(5, weekday(st)) + 1,0))
                                else least(floor((datediff (ed, st) +1) % 7), greatest(least(6, weekday(ed)+7) - greatest(5, weekday(st)) + 1,0)) end
            else 0
        end as num_of_sat_and_sun
from (select '2019-01-07' as st, '2019-01-12' as ed) x

这是以前问过的问题:可能重复的我已经阅读了这两个问题,我需要一些帮助,了解WHERE DATEPARTdw,xx,yy+@@DATEFIRST%7不在0,1中的正确语法?我使用DimDate维度执行此操作,并将其用于日期工作。如果您有每日粒度,那么将选择Count*from DimDate,其中DateVal介于xx和yy之间,DayOfWeek不在1,7中。不知道如何使其正常工作
SET DATEFIRST 7 -- 1: Sunday, 2: Monday

-- 2018-01-01 is a monday
SELECT (DATEPART(WEEKDAY, '2018-01-01') + @@DATEFIRST) % 7
-- Result: 2


SET DATEFIRST 1 -- 1: Monday, 7: Sunday

-- 2018-01-01 is a monday
SELECT (DATEPART(WEEKDAY, '2018-01-01') + @@DATEFIRST) % 7
-- Result: 2
WHERE
    --...
    AND (DATEPART(WEEKDAY, xx) + @@DATEFIRST) % 7 NOT IN (0, 1)
    AND (DATEPART(WEEKDAY, yy) + @@DATEFIRST) % 7 NOT IN (0, 1)
select  floor((datediff (ed, st)+1) / 7)*2 /*complete week's weekends*/
        + case when floor((datediff (ed, st) +1) % 7) between 0 and 6 /*additional weekends besides complete weeks*/
                then case when weekday(ed) >= weekday(st) then least(floor((datediff (ed, st) +1) % 7), greatest(least(6, weekday(ed)) - greatest(5, weekday(st)) + 1,0))
                                else least(floor((datediff (ed, st) +1) % 7), greatest(least(6, weekday(ed)+7) - greatest(5, weekday(st)) + 1,0)) end
            else 0
        end as num_of_sat_and_sun
from (select '2019-01-07' as st, '2019-01-12' as ed) x