SQL Server中如何按日期范围生成每日测试数据查询结果
解决方案
要实现指定日期范围内每个测试每天生成一行记录的需求,核心是生成目标日期序列,再将测试列表与日期序列做交叉关联,同时保留原有的表关联逻辑。
步骤说明
- 生成日期范围序列:用递归CTE创建从起始日期到结束日期的所有日期。
- 交叉关联测试与日期:将所有测试信息和日期序列做
CROSS JOIN,让每个测试在指定范围内的每一天都有一条记录。 - 关联统计数据:保留原有的
LEFT JOIN逻辑关联统计表,若没有对应日期的统计数据则显示NULL。
完整SQL语句
-- 定义日期范围,替换这里的起止日期即可 WITH DateRange AS ( SELECT CAST('2023-06-01' AS DATE) AS DateVal UNION ALL SELECT DATEADD(DAY, 1, DateVal) FROM DateRange WHERE DateVal < CAST('2023-06-03' AS DATE) ) SELECT l.testname AS Test, ds.tests_morning, ds.tests_evening, FORMAT(dr.DateVal, 'dd/MM/yyyy') AS Date -- 格式化日期为目标格式 FROM labtests_hajj l INNER JOIN departments d ON l.dept_id = d.dept_id CROSS JOIN DateRange dr -- 若departments_statistics表包含日期字段,添加AND ds.Date = dr.DateVal来精准匹配对应日期的统计数据 LEFT JOIN departments_statistics ds ON ds.test_id = l.testid ORDER BY dr.DateVal, l.testname;
关键细节
- 替换
DateRangeCTE中的起止日期,即可调整生成的日期范围。 - 使用
FORMAT函数将日期格式化为dd/MM/yyyy,匹配你示例中的输出格式。 - 如果
departments_statistics表有记录统计数据的日期字段,请在LEFT JOIN条件中添加AND ds.Date = dr.DateVal,这样能匹配到对应日期的统计值,否则会保留原关联逻辑返回NULL。
内容的提问来源于stack exchange,提问作者Ziad Adnan
相关产品推荐
相关产品推荐

