首页 > 解决方案 > 日期的 MS SQL 周数

问题描述

需要 sql 指令,在日期给我月的周数。搜索解决方案,但没有人按预期工作。

第一的:

 declare @date datetime = '2019-09-01'

 select datediff(week, dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, @date), 0)), 0), @date - 1) + 1

结果 - 0

 declare @date datetime = '2019-09-30'

 select datediff(week, dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, @date), 0)), 0), @date - 1) + 1

结果 - 5

再检查一个月 - 2019-08-01(结果 1)和 2019-08-31(结果 5)

第二:

 declare @d datetime = '2019-09-01' 

 select (day(@d)+datepart(weekday,dateadd(day,1-day(@d),@d))-datepart(weekday,@d))/7+1

结果 - 1

 declare @d datetime = '2019-09-30' 

 select (day(@d)+datepart(weekday,dateadd(day,1-day(@d),@d))-datepart(weekday,@d))/7+1

结果 - 5(必须为 6)

以及其他没有根据需要给出结果的解决方案。

一周的第一天出现问题 - 必须是星期一,而不是星期日。以 9 月为例,需要 01 sep - 第一周,02 sep - 第二周等

也许还有其他说明?

标签: sqlsql-server

解决方案


如果使用默认的一周的第一天,2019 年 9 月 30 日是第 5 周,而不是第 6 周。这是由DATEFIRST设置指定的。这会影响日期计算,例如DATEADDDATEPART(weekday)

如果您想使用不同的第一天,例如星期一,您必须更改设置

SET DATEFIRST 1;

当您进行更改时,您的最后一个查询适用于2019-09-012019-09-30

set datefirst 1

declare @date datetime = '2019-09-30'

select (day(@date)+datepart(weekday,dateadd(day,1-day(@date),@date))- datepart(weekday,@date))/7+1

这返回 6。因为2019-01-01它返回 1


推荐阅读