SQL Server 2008 R2 如何判断日期列是否存在连续5天的日期值
SQL Server 2008 R2 连续5天日期判断方案
我们采用分组标记法实现,核心逻辑是给去重后的日期生成递增序号,用日期减去对应序号的天数得到分组标识,连续日期会被分到同一组,统计组内记录数即可判断是否满足连续要求,该方案完全兼容SQL Server 2008 R2版本。
实现代码(直接返回是否存在符合要求的连续日期)
该方案使用EXISTS判断,匹配到符合条件的记录就终止查询,性能最优:
SELECT CASE WHEN EXISTS ( SELECT 1 FROM ( -- 对日期列去重,避免单日多条数据干扰统计 SELECT record_date, ROW_NUMBER() OVER (ORDER BY record_date) AS row_num FROM ( SELECT DISTINCT record_date FROM your_table ) t_distinct_date ) t_with_rn GROUP BY DATEADD(DAY, -row_num, record_date) HAVING COUNT(*) >= 5 ) THEN 'true' ELSE 'false' END AS has_5consecutive_days
扩展代码(查询所有符合要求的连续时间段)
如果需要查看具体的连续日期起止和天数,可以使用以下代码:
SELECT MIN(record_date) AS consecutive_start_date, MAX(record_date) AS consecutive_end_date, COUNT(*) AS consecutive_days_count FROM ( SELECT record_date, ROW_NUMBER() OVER (ORDER BY record_date) AS row_num FROM ( SELECT DISTINCT record_date FROM your_table ) t_distinct_date ) t_with_rn GROUP BY DATEADD(DAY, -row_num, record_date) HAVING COUNT(*) >= 5 ORDER BY consecutive_start_date
注意事项
- 请将代码中的
your_table替换为实际表名,record_date替换为实际的日期列名 - 如果日期列包含时间部分,需要统一转换为纯日期类型避免错误:将所有
record_date替换为CONVERT(DATE, record_date)即可 - 如果你的表已经保证
record_date列无重复值,可以去掉内层的SELECT DISTINCT子查询,进一步提升查询效率
内容的提问来源于stack exchange,提问作者user1618180
相关产品推荐
相关产品推荐

