SQL Server 2012中T-SQL如何排除特定时间段及周末数据?
解决SQL Server 2012中筛选指定日期区间并排除周末的问题
没问题,我帮你把这个T-SQL查询调整正确,同时适配SQL Server 2012的特性,确保逻辑完全符合你的需求。
首先,直接给你可用的完整查询:
SELECT * FROM Table1 WHERE ( [CreatedOn] BETWEEN '2016-07-01' AND '2017-03-25' OR [CreatedOn] BETWEEN '2017-07-01' AND '2018-03-25' ) AND DATENAME(dw, [CreatedOn]) NOT IN ('Saturday', 'Sunday')
关键细节解释:
- 括号的必要性:一定要把两个日期区间的
OR条件用括号包裹起来。如果省略括号,由于AND的优先级高于OR,查询逻辑会变成“在第一个区间且不是周末,或者在第二个区间(不管是不是周末)”,这完全不符合你的筛选要求。 - 关于周末过滤的稳定性:
DATENAME(dw, [CreatedOn])返回的是星期的英文名称,但这个结果会受SQL Server的语言设置影响。如果你的服务器语言不是英文,返回的会是对应语言的星期名(比如中文的“星期六”),这时候NOT IN ('Saturday', 'Sunday')就会失效。
更稳定的写法是用DATEPART(dw, [CreatedOn]),它返回数字代表星期几(默认美国英语设置下,1=周日,7=周六):
SELECT * FROM Table1 WHERE ( [CreatedOn] BETWEEN '2016-07-01' AND '2017-03-25' OR [CreatedOn] BETWEEN '2017-07-01' AND '2018-03-25' ) AND DATEPART(dw, [CreatedOn]) NOT IN (1, 7)
如果不确定你的服务器DATEFIRST设置(也就是哪一天作为一周的第一天),可以用SELECT @@DATEFIRST查看。比如如果DATEFIRST是1(周一为第一天),那么周六是6,周日是7,这时候条件要改成NOT IN (6, 7)。
内容的提问来源于stack exchange,提问作者user3115933
相关产品推荐
相关产品推荐

