SQL Server如何不硬编码查询数据表中每月的最后一个周六日期
SQL Server 筛选每月最后一个周六实现方案
场景1:数据表已仅存储周六日期(和示例结构一致)
这种情况逻辑最简单,直接按日期所属的年月分组,取每组最大的日期即可。
示例代码
假设你的表名为weekend_calendar,存储周六的日期列名为saturday_dt,字段类型为DATE:
SELECT FORMAT(MAX(saturday_dt), 'dd-MM-yyyy') AS last_saturday_of_month FROM weekend_calendar GROUP BY DATEPART(YEAR, saturday_dt), DATEPART(MONTH, saturday_dt) ORDER BY last_saturday_of_month
运行后输出和期望结果完全一致:
28-08-2021
25-09-2021
场景2:数据表存储全量日期,需要先筛选周六再取值
如果你的表不是仅存周六记录,需要先过滤出周六再做分组计算。为了避免@@DATEFIRST配置差异导致的周计算错误,推荐用固定基准日的方式判断周六:
示例代码
SELECT FORMAT(MAX(date_col), 'dd-MM-yyyy') AS last_saturday_of_month FROM your_table -- 1900-01-06是固定的周六,以此为基准判断不受DATEFIRST配置影响 WHERE DATEDIFF(DAY, '1900-01-06', date_col) % 7 = 0 GROUP BY DATEPART(YEAR, date_col), DATEPART(MONTH, date_col) ORDER BY last_saturday_of_month
补充说明
- 如果不需要格式化输出、要保留原始日期类型,去掉
FORMAT函数直接取MAX(日期列)即可 - 若使用SQL Server 2012之前的版本,不支持
FORMAT函数,可以将格式化部分替换为CONVERT(VARCHAR, MAX(日期列), 105),105为SQL Server中对应dd-MM-yyyy格式的转换编号 - 如果需要同时输出对应的年月维度,可以在SELECT中增加
DATEPART(YEAR, 日期列) AS 年份、DATEPART(MONTH, 日期列) AS 月份字段
内容的提问来源于stack exchange,提问作者user14697114
相关产品推荐
相关产品推荐

