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

SQL中统计日期区间内2月1日出现次数的方法正确性验证

验证统计日期区间内2月1日数量的SQL方法正确性

我有一张名为myt的SQL表,表结构和数据如下:

建表语句

CREATE TABLE myt (
    Name VARCHAR(50),
    Date_1 DATE,
    Date_2 DATE,
    Year_1 INT,
    Month_1 INT,
    Day_1 INT,
    Year_2 INT,
    Month_2 INT,
    Day_2 INT
);

插入数据语句

INSERT INTO myt (Name, Date_1, Date_2, Year_1, Month_1, Day_1, Year_2, Month_2, Day_2) VALUES
( 'p1', '2010-01-01', '2010-05-01', 2010, 1, 1, 2010, 5, 1),
( 'p2', '2010-01-01', '2013-09-09', 2010, 1, 1, 2013, 9, 9);

表数据展示

NameDate_1Date_2Year_1Month_1Day_1Year_2Month_2Day_2
p12010-01-012010-05-01201011201051
p22010-01-012013-09-09201011201399

需求

  • 针对每一行数据,统计Date_1和Date_2之间包含的2月1日(Feb-01)的数量。

示例

  • p1:Date_1为2010-01-01,Date_2为2010-05-01,结果为1(包含2010年2月1日)
  • p2:Date_1为2010-01-01,Date_2为2013-09-09,结果为4(包含2010、2011、2012、2013年的2月1日)

我的实现方法

我没有找到专门处理该需求的SQL函数,因此用标准化方法实现了如下查询:

SELECT *, 
       (year_2 - year_1 + 
       (CASE WHEN month_1 < 2 OR (month_1 = 2 AND day_1 <= 1) THEN 1 ELSE 0 END) - 
       (CASE WHEN month_2 < 2 OR (month_2 = 2 AND day_2 < 1) THEN 1 ELSE 0 END)) as feb1_count
FROM myt;

测试结果

NameDate_1Date_2Year_1Month_1Day_1Year_2Month_2Day_2feb1_count
p12010-01-012010-05-012010112010511
p22010-01-012013-09-092010112013994

问题

请问这个方法是否正确?


回答

你的方法是正确的,逻辑严谨且能覆盖所有边界场景,下面拆解公式的核心逻辑:

公式核心:year_2 - year_1 + 起始年份修正值 - 结束年份修正值

  1. 基础值:year_2 - year_1
    计算起止年份的跨度,为后续修正提供基础数值,比如p2的2013-2010=3。

  2. 起始年份修正值

    CASE WHEN month_1 < 2 OR (month_1 = 2 AND day_1 <= 1) THEN 1 ELSE 0 END
    

    判断起始日期是否在2月1日或更早:如果是,说明当年的2月1日被包含在区间内,加1;如果起始日期在2月1日之后,当年的2月1日不在区间内,不加。

  3. 结束年份修正值

    CASE WHEN month_2 < 2 OR (month_2 = 2 AND day_2 < 1) THEN 1 ELSE 0 END
    

    判断结束日期是否在2月1日之前:如果是(比如结束日期在1月),说明当年的2月1日不在区间内,需要减去1;如果结束日期在2月1日及之后,则不减。

边界场景验证

我们用几个特殊场景测试公式的正确性:

  • 场景1:Date_1=2010-02-02,Date_2=2010-03-01 → 公式计算:0+0-0=0,正确(2010年2月1日不在区间内)。
  • 场景2:Date_1=2010-02-01,Date_2=2010-02-01 → 公式计算:0+1-0=1,正确(当天就是2月1日)。
  • 场景3:Date_1=2010-03-01,Date_2=2013-01-01 → 公式计算:3+0-1=2,正确(包含2011、2012年的2月1日)。
  • 场景4:Date_1=2010-01-01,Date_2=2010-01-31 → 公式计算:0+1-1=0,正确(2010年2月1日不在区间内)。

所有场景验证下来,公式都能得到正确结果,因此这个方法是可靠的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:02:19