You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 10:12:35