我试图在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天但不包括周末的记录。谢谢
答案 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()