where子句选择大于3天但不包括周末的记录(星期六和星期日)

时间:2019-02-12 17:01:46

标签: sql-server

我试图在SQL Server中选择比当前日期多3天的记录,但是我需要排除周末(星期六和星期日)。

以下SQL脚本可用于选择3天以上的记录:

select * from [dbo].[tb_Schedule]
WHERE date >= DATEADD(day, -3, GETDATE())

但是问题是我不知道如何排除周末。

我知道以下Where子句用于排除周末,但我不知道如何在上述where子句中实现它

WHERE ((DATEPART(dw, date_created) + @@DATEFIRST) % 7) NOT IN (0, 1)

请协助我选择超过3天但不包括周末的记录。谢谢

3 个答案:

答案 0 :(得分:1)

这是一个公式,其中包含有关如何排除周末的示例。如前所述,请考虑使用日历表,因为您可能希望排除假期。

SELECT calDate, 
    DATENAME( dw, calDate), 
    DATEADD( DD, -( 3 + CASE WHEN DATEDIFF( DD, '19000106', calDate)%7 <= 2 THEN DATEDIFF( DD, '19000106', calDate)%7
                            WHEN DATEDIFF( DD, '19000106', calDate)%7 = 3 THEN 2
                            ELSE 0 END), calDate)
FROM (VALUES( CAST( '20190201' AS date)),
            ( CAST( '20190202' AS date)),
            ( CAST( '20190203' AS date)),
            ( CAST( '20190204' AS date)),
            ( CAST( '20190205' AS date)),
            ( CAST( '20190206' AS date)),
            ( CAST( '20190207' AS date)),
            ( CAST( '20190208' AS date)),
            ( CAST( '20190209' AS date)),
            ( CAST( '20190210' AS date)),
            ( CAST( '20190211' AS date)),
            ( CAST( '20190212' AS date)),
            ( CAST( '20190213' AS date)),
            ( CAST( '20190214' AS date)),
            ( CAST( '20190215' AS date)))x(calDate);

答案 1 :(得分:1)

如果您只排除周末而不是假期,则可以使用AND加入这些子句。此代码与WEEKDAY一起使用DATEPART,因为它更易于阅读。不过,这不适用于假期。

SELECT * 
FROM [dbo].[tb_Schedule]
WHERE 
    [date] >= DATEADD(DAY, -3, GETDATE())
    AND DATEPART(WEEKDAY,[date]) NOT IN (1,7)

答案 2 :(得分:0)

0

只有在周日调用此 select (仅返回2天)时,操作才会失败。

此外,如果只需要GetDate()的 date 部分,则可以将最后的select * from [dbo].[tb_Schedule] where date >= DATEADD(DD, -3 -case SIGN((DATEPART(DW, GETDATE()) + @@DATEFIRST + 5) % 7 - 3) when -1 then 2 else 0 end, GETDATE()) 替换为GETDATE()