如何修改SQL查询将多日期转为最小最大日期范围格式?
解决方案
假设你的数据源是包含分组标识和日期字段的表(示例中用EventTable,分组字段GroupID,日期字段EventDate),以下是满足需求的SQL写法,同时保留SUBSTRING形式:
WITH DateAggregates AS ( SELECT GroupID, MIN(EventDate) AS MinEventDate, MAX(EventDate) AS MaxEventDate, COUNT(DISTINCT EventDate) AS DateCount FROM EventTable GROUP BY GroupID ) SELECT GroupID, -- 保留SUBSTRING形式,通过FOR XML PATH生成文本后截取 SUBSTRING( (SELECT CASE WHEN da.DateCount = 1 THEN CONVERT(VARCHAR, da.MinEventDate, 103) ELSE CONCAT(CONVERT(VARCHAR, da.MinEventDate, 3), '-', CONVERT(VARCHAR, da.MaxEventDate, 103)) END FOR XML PATH('')), 1, 1000) AS DateResult FROM DateAggregates da
关键说明
- 先聚合再判断:通过CTE
DateAggregates先统计每个分组的最小日期、最大日期和日期总数,这是解决你之前CASE表达式失效的核心——之前的错误大概率是在行级别而非分组级别做判断,导致逻辑混乱。 - 日期格式控制:
- 单个日期时用
CONVERT(VARCHAR, ..., 103)输出dd/mm/yyyy格式 - 多日期时,最小日期用
CONVERT(VARCHAR, ..., 3)输出dd/mm(不带年份),最大日期保留dd/mm/yyyy完整格式,拼接成最小日/月-最大日/月/年
- 单个日期时用
- 保留SUBSTRING形式:即使最终是单个字符串,依然通过
FOR XML PATH('')生成文本流,再用SUBSTRING截取(从第1位开始取足够长的长度),完全满足你对保留该形式的要求。
测试示例
如果你的表数据如下:
| GroupID | EventDate |
|---|---|
| 1 | 2024-05-10 |
| 1 | 2024-05-15 |
| 2 | 2024-06-20 |
执行查询后会得到:
| GroupID | DateResult |
|---|---|
| 1 | 10/05-15/05/2024 |
| 2 | 20/06/2024 |
内容的提问来源于stack exchange,提问作者hg05
相关产品推荐
相关产品推荐

