sql - 日期的 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 - 第二周等
也许还有其他说明?
解决方案
如果使用默认的一周的第一天,2019 年 9 月 30 日是第 5 周,而不是第 6 周。这是由DATEFIRST设置指定的。这会影响日期计算,例如DATEADD
和DATEPART(weekday)
如果您想使用不同的第一天,例如星期一,您必须更改设置
SET DATEFIRST 1;
当您进行更改时,您的最后一个查询适用于2019-09-01
和2019-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
推荐阅读
- c++ - char数组如何存储在内存中?
- cassandra - Cassandra 读取过程示例
- sql - PostgreSQL | 无法使用 psql 从 shell 脚本中删除表
- c# - 如何在没有 403 错误代码的情况下用 C# 在 Instagram 上点赞照片
- react-native - 如何将反应上下文与反应导航一起使用
- excel - 为什么复制和粘贴错误的行
- html - 为什么“inline-block”属性在此页面上不起作用?
- arrays - 如何在普通lisp中无损交换二维数组中的两行
- c# - unity Fade In/Out IndexOutOfRangeException - 不规则错误
- visual-studio-code - 如何禁用 VSCode 工作台列表键盘导航?