关联查询中DATEDIFF返回结果不符合预期的问题排查
你的SQL查询问题分析与修正
咱们来一步步拆解你的问题,看看为什么结果和手动统计不一致:
核心问题1:用错了计算逻辑
你现在用DATEDIFF(dd, [Start Date], [End Date])得到的只是起止日期的天数差(2020-03-23 减 2020-03-19 刚好是4天),这个函数完全没有关联Date_Master里的Workday标记——相当于你根本没用到工作日表的数据,自然得不到正确的工作日数量。
核心问题2:查询结构错误,缺少分组统计
你的LEFT JOIN会把Main里的那条记录,和Date_Master中所有在2020-03-19到2020-03-23之间且Workday=1的记录进行匹配,也就是会生成3条行(对应19、20、23三个工作日),但你没有用GROUP BY分组,也没有用COUNT统计这些匹配行的数量,反而直接取了DATEDIFF的结果,这就导致结果完全偏离预期。
次要问题:LEFT JOIN被WHERE条件转成了INNER JOIN
你把Workday=1写在WHERE子句里,会过滤掉所有Date_Master中匹配不到的行(比如非工作日的日期),这会让原本的LEFT JOIN变成INNER JOIN——如果某个员工的起止日期全是非工作日,你的查询会直接返回空结果,而不是0,这不符合统计逻辑。
修正后的SQL查询
SELECT [ID], COUNT([Master Date]) AS 'Start Date - End Date (Business Days)' FROM Main LEFT JOIN Date_Master ON [Master Date] BETWEEN [Start Date] AND [End Date] AND Workday = 1 -- 把工作日条件放到JOIN的ON子句里,保留LEFT JOIN的特性 WHERE [ID] = '528950' GROUP BY [ID] -- 按ID分组,统计每个员工的工作日数量
这个查询会正确统计Date_Master中落在起止日期范围内且标记为工作日的记录数量,针对你的例子会返回3天,和手动统计的结果一致。
内容的提问来源于stack exchange,提问作者8indie8
相关产品推荐
相关产品推荐

