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

如何用SQL按最小Start_Dt和最大End_Dt计算总月份数?

SQL实现:按Name分组取起止日期并计算总月份数

需求分析

给定包含Name、Start_Dt、End_Dt、Months字段的数据表,需要按Name分组,获取每组的最早开始日期、最晚结束日期,并计算这两个日期之间的总月份数(示例中每组总月份为12,对应2021全年跨度)。

核心逻辑

  1. 按Name分组,通过聚合函数MIN(Start_Dt)获取每组最早开始日期,MAX(End_Dt)获取最晚结束日期。
  2. 基于起止日期计算总月份数:需注意不同数据库的日期函数差异,核心是计算两个日期的月份跨度并包含首尾月份。

分数据库实现代码

MySQL

SELECT
    Name,
    MIN(Start_Dt) AS Start_Dt,
    MAX(End_Dt) AS End_Dt,
    TIMESTAMPDIFF(MONTH, MIN(Start_Dt), MAX(End_Dt)) + 1 AS Total_Mo
FROM your_table_name
GROUP BY Name;
  • 说明:TIMESTAMPDIFF(MONTH, start, end)返回两个日期的整月差,加1是为了包含起始月份(如2021-01-01到2021-12-31的整月差为11,加1后得到12)。

PostgreSQL

SELECT
    Name,
    MIN(Start_Dt) AS Start_Dt,
    MAX(End_Dt) AS End_Dt,
    (EXTRACT(YEAR FROM MAX(End_Dt)) - EXTRACT(YEAR FROM MIN(Start_Dt))) * 12 +
    (EXTRACT(MONTH FROM MAX(End_Dt)) - EXTRACT(MONTH FROM MIN(Start_Dt))) + 1 AS Total_Mo
FROM your_table_name
GROUP BY Name;
  • 说明:通过提取年份和月份的差值计算总跨度,最后加1包含起始月份。

SQL Server

SELECT
    Name,
    MIN(Start_Dt) AS Start_Dt,
    MAX(End_Dt) AS End_Dt,
    DATEDIFF(MONTH, MIN(Start_Dt), MAX(End_Dt)) + 1 AS Total_Mo
FROM your_table_name
GROUP BY Name;
  • 说明:DATEDIFF(MONTH, start, end)返回整月差,加1后得到包含首尾的总月份数。

关键注意点

不要直接使用SUM(Months)计算总月份:原数据中存在时间重叠的记录(如Name=1234有多条2021-01-01开始的记录),直接求和会重复计算重叠月份,不符合需求中“按整个时间段跨度计算”的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:53:02