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);
表数据展示
| Name | Date_1 | Date_2 | Year_1 | Month_1 | Day_1 | Year_2 | Month_2 | Day_2 |
|---|---|---|---|---|---|---|---|---|
| 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 |
需求
- 针对每一行数据,统计
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;
测试结果
| Name | Date_1 | Date_2 | Year_1 | Month_1 | Day_1 | Year_2 | Month_2 | Day_2 | feb1_count |
|---|---|---|---|---|---|---|---|---|---|
| p1 | 2010-01-01 | 2010-05-01 | 2010 | 1 | 1 | 2010 | 5 | 1 | 1 |
| p2 | 2010-01-01 | 2013-09-09 | 2010 | 1 | 1 | 2013 | 9 | 9 | 4 |
问题
请问这个方法是否正确?
回答
你的方法是正确的,逻辑严谨且能覆盖所有边界场景,下面拆解公式的核心逻辑:
公式核心:year_2 - year_1 + 起始年份修正值 - 结束年份修正值
基础值:year_2 - year_1
计算起止年份的跨度,为后续修正提供基础数值,比如p2的2013-2010=3。起始年份修正值
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日不在区间内,不加。
结束年份修正值
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
相关产品推荐
相关产品推荐

