SQL DATEADD函数获取上月日期范围失效问题求助
问题排查:日期范围查询错误包含更早数据
核心原因
你的变量@lastMonthBegin和@lastMonthEnd定义为Date类型,但赋值时却将日期转换为varchar格式(106即dd mon yyyy)。SQL执行WHERE条件时,会把CompletedAt字段(日期类型)隐式转换为字符串进行比较,而字符串的排序逻辑和日期完全不同:
- 例如
'31 May 2024'(5月31日)的首字符是3,'01 Jul 2024'(7月1日)的首字符是0,字符串比较中'31 May 2024' >= '01 Jul 2024'会被判定为true,导致5月31日的数据被错误包含。
修复方案
去掉不必要的CONVERT(varchar, ..., 106)转换,直接用日期类型计算赋值,保持变量和字段的类型一致:
DECLARE @lastMonthBegin AS Date DECLARE @lastMonthEnd AS Date -- 计算上月第一天:当前日期减1个月后,取当月第一天 SET @lastMonthBegin = DATEADD(day, 1 - DAY(DATEADD(month, -1, GETDATE())), DATEADD(month, -1, GETDATE())) -- 计算上月最后一天:当前日期取当月第一天后减1天 SET @lastMonthEnd = DATEADD(day, -1, DATEADD(day, 1 - DAY(GETDATE()), GETDATE())) SELECT OrderDriverAssignmentID, CompletedAt, IsActive FROM TOrderDriverAssignment WHERE CompletedAt >= @lastMonthBegin AND CompletedAt <= @lastMonthEnd
额外优化建议
如果CompletedAt是datetime或datetime2类型,建议将结束条件改为CompletedAt < DATEADD(day, 1, @lastMonthEnd),避免遗漏当天最后一秒的数据,同时避免包含下月0点的数据:
WHERE CompletedAt >= @lastMonthBegin AND CompletedAt < DATEADD(day, 1, @lastMonthEnd)
内容的提问来源于stack exchange,提问作者LogisticsRay
相关产品推荐
相关产品推荐

