You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在SQL中计算起止日期及不同日期区间的天数差?

嘿,我来帮你搞定SQL里日期区间天数统计的问题!分两种常见场景给你详细拆解,都是实际项目里用得顺手的方案👇

一、单个起止日期之间的天数统计

不同SQL数据库的函数略有差异,我整理了主流数据库的实现方式:

MySQL/MariaDB

DATEDIFF()函数,参数顺序是结束日期在前,开始日期在后,返回两者的天数差:

-- 统计2024-05-10到2024-05-20的间隔天数(不包含20号当天)
SELECT DATEDIFF('2024-05-20', '2024-05-10') AS days_between;

预期返回:10

如果需要包含起止日期当天,记得加1:

SELECT DATEDIFF('2024-05-20', '2024-05-10') + 1 AS days_include_both;

预期返回:11

PostgreSQL

直接用日期相减,或者用DATE_PART()函数:

-- 方式1:日期直接相减
SELECT ('2024-05-20'::date - '2024-05-10'::date) AS days_between;

-- 方式2:用DATE_PART提取天数差
SELECT DATE_PART('day', '2024-05-20'::date - '2024-05-10'::date) AS days_between;

两种方式都返回10,包含首尾的话同样加1即可。

SQL Server

DATEDIFF()函数,参数顺序是单位、开始日期、结束日期

-- 统计间隔天数(不包含结束日期)
SELECT DATEDIFF(day, '2024-05-10', '2024-05-20') AS days_between;

预期返回:10,包含首尾加1即可。

注意: 确保日期格式符合数据库要求,避免隐式转换报错;如果起止日期可能为NULL,建议用COALESCE()处理,比如DATEDIFF(day, COALESCE(start_date, '1900-01-01'), COALESCE(end_date, GETDATE()))

二、不同日期区间的天数统计(批量多个区间)

如果要同时统计多个独立区间的天数,分两种情况处理:

情况1:已知固定的多个区间

UNION ALL构造区间数据,再逐个计算:
以MySQL为例:

SELECT 
  '春节假期' AS interval_name,
  '2024-02-10' AS start_date,
  '2024-02-17' AS end_date,
  DATEDIFF(end_date, start_date) + 1 AS days_count
UNION ALL
SELECT 
  '五一假期' AS interval_name,
  '2024-05-01' AS start_date,
  '2024-05-05' AS end_date,
  DATEDIFF(end_date, start_date) + 1 AS days_count
UNION ALL
SELECT 
  '国庆假期' AS interval_name,
  '2024-10-01' AS start_date,
  '2024-10-07' AS end_date,
  DATEDIFF(end_date, start_date) + 1 AS days_count;

预期返回结果:

interval_namestart_dateend_datedays_count
春节假期2024-02-102024-02-178
五一假期2024-05-012024-05-055
国庆假期2024-10-012024-10-077

情况2:从表中读取区间数据

假设你有一张存储区间的表date_intervals,字段为id, interval_name, start_date, end_date,直接查询计算即可:

SELECT 
  id,
  interval_name,
  start_date,
  end_date,
  -- 包含首尾日期的天数
  DATEDIFF(end_date, start_date) + 1 AS days_count
FROM date_intervals
-- 过滤无效的NULL日期
WHERE start_date IS NOT NULL AND end_date IS NOT NULL;

如果需要统计所有区间的总天数,用SUM()聚合:

SELECT SUM(DATEDIFF(end_date, start_date) + 1) AS total_days
FROM date_intervals
WHERE start_date IS NOT NULL AND end_date IS NOT NULL;

额外提示: 数据库的日期函数会自动处理闰年、不同月份天数差异等问题,不用手动计算,放心用就行!

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

火山引擎 最新活动