如何调整SQL查询,仅筛选当前日期过去一年的数据并排除未来日期?
问题说明
我想筛选当前日期过去12个月的数据,当前查询能返回部分目标日期,但同时包含了未来的提前预订假期日期。需要修改SQL语句,使其仅返回当前日期过去一年的数据。
原查询语句
FROM DATABASE.dbo.tbl_Adjustment INNER JOIN DATABASE.dbo.tbldbST01_Personnel ON DATABASE.dbo.tbl_Adjustment.Per_iCurrentID = DATABASE.dbo.tbldbST01_Personnel.Per_lCurrentId WHERE DATABASE.dbo.tbl_Adjustment.Per_iCurrentID = 257 AND (NOT(DATABASE.dbo.tbl_Adjustment.DsId = N'0')) AND DATABASE.dbo.tbl_Adjustment.AttDate >= GETDATE()-365 ORDER BY DATABASE.dbo.tbl_Adjustment.AttDate DESC
原查询结果
31/05/2024 00:00:00.000 30/05/2024 00:00:00.000 29/05/2024 00:00:00.000 28/05/2024 00:00:00.000 27/05/2024 00:00:00.000 06/05/2024 00:00:00.000 01/04/2024 00:00:00.000 29/03/2024 00:00:00.000 01/01/2024 00:00:00.000 29/12/2023 00:00:00.000 28/12/2023 00:00:00.000 27/12/2023 00:00:00.000 26/12/2023 00:00:00.000 25/12/2023 00:00:00.000 26/09/2023 00:00:00.000 25/09/2023 00:00:00.000
修改后的SQL语句
原查询只限制了日期下限,未设置上限,导致未来日期被纳入结果。另外,GETDATE()-365的计算方式在闰年时会有误差,建议用DATEADD函数精确计算一年前的日期。修改后的语句如下:
FROM DATABASE.dbo.tbl_Adjustment INNER JOIN DATABASE.dbo.tbldbST01_Personnel ON DATABASE.dbo.tbl_Adjustment.Per_iCurrentID = DATABASE.dbo.tbldbST01_Personnel.Per_lCurrentId WHERE DATABASE.dbo.tbl_Adjustment.Per_iCurrentID = 257 AND (NOT(DATABASE.dbo.tbl_Adjustment.DsId = N'0')) AND DATABASE.dbo.tbl_Adjustment.AttDate >= DATEADD(year, -1, GETDATE()) AND DATABASE.dbo.tbl_Adjustment.AttDate <= GETDATE() ORDER BY DATABASE.dbo.tbl_Adjustment.AttDate DESC
关键修改说明
- 添加
AttDate <= GETDATE()条件,直接过滤所有晚于当前日期的记录,排除未来的预订数据。 - 替换
GETDATE()-365为DATEADD(year, -1, GETDATE()),确保无论是否闰年,都能精准获取当前日期往前推一年的时间,避免日期范围出现偏差。
内容的提问来源于stack exchange,提问作者Dimind
相关产品推荐
相关产品推荐

