SQL Server查询中GETDATE()无法返回当日日期的问题求解
问题根因
你的查询查不到当日数据有两个核心错误:
GETDATE()返回值带当前系统的精确时分秒、毫秒信息,而production_date是DATETIME类型,存储的当日记录会自带业务发生的时间(比如2022-07-12 09:15:32),直接用等值匹配只能命中和当前系统时间完全一致的记录,自然无法返回当日其他时间的数据。传入7/12/22这类格式的字符串日期查不到结果,一方面是字符串转日期时存在区域设置导致的月/日识别歧义,另一方面也存在同样的时间部分不匹配问题。- WHERE子句中逻辑运算符优先级错误:SQL中
AND的运算优先级高于OR,你当前的写法实际执行逻辑为(company_code = '10' AND production_date = GETDATE() AND posting_type = 'MMQ') OR posting_type = 'IRS' OR posting_type = 'PME',后两个OR关联的条件会绕过公司编码、日期的过滤规则,返回大量不符合预期的结果。
修正后的可运行SQL
SELECT t.item_no, SUM(t.good_quantity) AS [Good Qty], SUM(t.scrap_quantity) AS [Scrap Qty], i.selling_price FROM acsAUTOSYS.dbo.inventory_master i FULL OUTER JOIN acsMFG.dbo.production_posting_trans t ON t.item_no = i.item_no AND i.company_code = t.company_code WHERE t.company_code = '10' -- 日期范围匹配:覆盖当日0点到次日0点的所有时间记录,可命中字段索引 AND t.production_date >= CAST(GETDATE() AS DATE) AND t.production_date < DATEADD(DAY, 1, CAST(GETDATE() AS DATE)) -- 多枚举值条件加括号明确逻辑,避免优先级错误 AND ( t.posting_type = 'MMQ' OR t.posting_type = 'IRS' OR t.posting_type = 'PME' ) GROUP BY t.item_no, i.selling_price
注意事项
- 传入字符串格式的日期参数时,不要使用
7/12/22这类存在歧义的格式,不同服务器区域设置可能将其识别为7月12日或12月7日,统一使用'2022-07-12'这类ISO标准日期格式即可避免转换错误。 - 上述范围查询的日期判断写法,比
CAST(production_date AS DATE) = CAST(GETDATE() AS DATE)的写法性能更优,不会导致production_date字段上的索引失效。
内容的提问来源于stack exchange,提问作者Tucker81
相关产品推荐
相关产品推荐

