当前位置: 首页 > news >正文

【SQL】计算一年内每个月份的周数据

        通过SQL编程实现以下功能:计算2025年内每个月份的周数据。要求每周从周日开始作为第一天,按月进行自然周分组,最终输出包含月份和周次的结果集。

SET DATEFIRST 7; -- 设置周日作为一周的第一天DECLARE @FirstDayOfYEAR DATE = '2025-01-01';  -- 年份起始日-- 生成全年所有月份
WITH Months AS (SELECT MonthNumber = 1,FirstDayOfMonth = @FirstDayOfYEAR,EndOfMonth = DATEADD(DAY, -1, DATEADD(MONTH, 1, @FirstDayOfYEAR))UNION ALLSELECT MonthNumber + 1,DATEADD(MONTH, 1, FirstDayOfMonth),DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEADD(MONTH, 1, FirstDayOfMonth)))FROM MonthsWHERE MonthNumber < 12
),
-- 每个月的第一个周日
FirstSundayCTE AS (SELECT *,FirstSunday = CASE WHEN DATEPART(WEEKDAY, FirstDayOfMonth) = 1 THEN FirstDayOfMonthELSE DATEADD(DAY, (8 - DATEPART(WEEKDAY, FirstDayOfMonth)) % 7, FirstDayOfMonth)ENDFROM Months
),
-- 递归生成每周区间
Weeks AS (-- 第一周(可能跨月)SELECT MonthNumber,WeekNumber = 1,StartDate = FirstDayOfMonth,EndDate = CASE WHEN FirstSunday > FirstDayOfMonth THEN DATEADD(DAY, -1, FirstSunday)  -- 非完整周ELSE DATEADD(DAY, 6, FirstDayOfMonth)   -- 完整周(周日为第一天)END,EndOfMonthFROM FirstSundayCTEWHERE FirstSunday >= FirstDayOfMonth  -- 允许首日为周日UNION ALL-- 后续周(周日到下周六)SELECT MonthNumber,WeekNumber = WeekNumber + 1,StartDate = DATEADD(DAY, 1, Prev.EndDate),EndDate = CASE WHEN DATEADD(DAY, 6, DATEADD(DAY, 1, Prev.EndDate)) > EndOfMonth THEN EndOfMonth ELSE DATEADD(DAY, 6, DATEADD(DAY, 1, Prev.EndDate)) END,EndOfMonthFROM Weeks AS PrevWHERE DATEADD(DAY, 1, Prev.EndDate) <= EndOfMonth
)SELECT MonthNumber, WeekNumber, StartDate, EndDate FROM Weeks;
http://www.dtcms.com/a/354622.html

相关文章:

  • 基于大型语言模型的自然语言到 SQL 转换研究综述:我们身处何处,又将前往何方?
  • MyBatis 动态 SQL 精讲:告别硬编码的智能拼接艺术
  • 【Depth与RGB对齐算法(D2C)】
  • PPT处理控件Aspose.Slides教程:在 C# 中将 PPTX 转换为 Markdown
  • 项目一系列-第7章 父子组件通信
  • vue3使用axios向spring boot 发送请求,请求响应时间快慢交替问题分析
  • 探索 Vertex AI 与 Elasticsearch
  • Ubuntu 从零到一搭建 Appium+Python 自动化环境(含下厨房真机实战)—2025 版
  • 导出wireshark的FLV RAW数据并进行分析
  • 第13集 当您的USB设备不在已实测支持列表,如何让TOS-WLink支持您的USB设备--答案Wireshark USB抓包
  • [数据结构] ArrayList与顺序表(下)
  • indexDB快速上手
  • 2015考研数学(二)真题
  • 让模糊物体变清晰的视频AI:快速提升画质指南
  • 51c大模型~合集175
  • pcl_案例2 叶片与根茎的分离
  • Redis发布订阅:实时消息系统的极简解决方案
  • MyBatis延迟加载
  • 云计算学习100天-第29天
  • Node.js 的模块化规范是什么?CommonJS 和 ES6 模块有什么区别?
  • Python DELL Logo
  • day1 ———C++———变量和字符串的使用
  • AI驱动企业数字化转型:解码未来三年的智能化变革密码
  • STAGEWISE实战指南:从集成到使用的完整解决方案
  • AI在商业领域的多元应用:从写作助手到精准运营,解锁AI商业工具新价值
  • 流程控制语句(3)
  • 操作系统中的死锁是什么意思
  • 农行广西区分行携手广西专精特新商会共探金融赋能专精特新企业新路径
  • 用KPI导航数字化转型:制造企业如何科学评估系统上线成效
  • 流程控制语句(2)