You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

关键说明

  1. 先聚合再判断:通过CTEDateAggregates先统计每个分组的最小日期、最大日期和日期总数,这是解决你之前CASE表达式失效的核心——之前的错误大概率是在行级别而非分组级别做判断,导致逻辑混乱。
  2. 日期格式控制:
    • 单个日期时用CONVERT(VARCHAR, ..., 103)输出dd/mm/yyyy格式
    • 多日期时,最小日期用CONVERT(VARCHAR, ..., 3)输出dd/mm(不带年份),最大日期保留dd/mm/yyyy完整格式,拼接成最小日/月-最大日/月/年
  3. 保留SUBSTRING形式:即使最终是单个字符串,依然通过FOR XML PATH('')生成文本流,再用SUBSTRING截取(从第1位开始取足够长的长度),完全满足你对保留该形式的要求。

测试示例

如果你的表数据如下:

GroupIDEventDate
12024-05-10
12024-05-15
22024-06-20

执行查询后会得到:

GroupIDDateResult
110/05-15/05/2024
220/06/2024

内容的提问来源于stack exchange,提问作者hg05

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:27:34