给datetime添加固定时间后查询返回意外空结果问题
问题分析与解决方案
你的查询返回空结果的核心原因是日期范围的计算逻辑错误,导致结束时间早于开始时间,形成了一个完全无效的查询区间。
错误原因拆解
你当前对@enddate的处理用了:
DATEADD(m, DATEDIFF(m, 0, convert(date, @ENDDATE)), 0) + '05:59:59'
这个表达式的作用是取@enddate所在月份的第一天(比如@enddate是2017-01-02时,会得到2017-01-01 00:00:00),再加上05:59:59,最终结果是2017-01-01 05:59:59。
而你对@startdate的处理得到的是2017-01-01 06:00:00,这就导致你的查询条件变成了:
csd.tendered_date_time BETWEEN '2017-01-01 06:00:00' AND '2017-01-01 05:59:59'
结束时间比开始时间早,自然不会返回任何数据。
正确的日期偏移写法
根据你的业务需求(交易时间偏移为当日06:00到次日05:59:59),正确的做法是直接取@startdate的日期部分加上06:00,取@enddate的日期部分加上05:59:59。修正后的查询示例:
DECLARE @startdate datetime; DECLARE @enddate datetime; SET @startdate = convert(datetime,'2017-01-01'); SET @enddate = convert(datetime,'2017-01-02'); SELECT * FROM ig_Business..Check_Item_Detail CID (NOLOCK) JOIN ig_business..Check_Sales_Detail CSD (NOLOCK) ON CSD.transaction_data_id = CID.transaction_data_id WHERE csd.tendered_date_time BETWEEN DATEADD(day, DATEDIFF(day, 0, @STARTDATE), 0) + '06:00:00' AND DATEADD(day, DATEDIFF(day, 0, @ENDDATE), 0) + '05:59:59';
这里用DATEADD(day, DATEDIFF(day, 0, @date), 0)来获取@date的纯日期部分(去掉时间),再加上固定的时间偏移,就能得到正确的区间:2017-01-01 06:00:00 到 2017-01-02 05:59:59,完全匹配你的业务时间偏移需求。
额外小建议
- 尽量避免直接用字符串拼接日期和时间,推荐用
DATEADD函数来添加时间,比如:DATEADD(hour,6, DATEADD(day, DATEDIFF(day,0,@STARTDATE),0)),这样更安全,不会因为日期格式问题出错。 - 测试查询区间时,可以先单独输出
BETWEEN前后的两个值,确认区间是有效的(开始时间 ≤ 结束时间),再执行完整查询。
内容的提问来源于stack exchange,提问作者Asher
相关产品推荐
相关产品推荐

