我需要一个月的周数。本周需要在周四开始。
我尝试了很多答案,但我在下面的条件并不令人满意。
例如:以下日期的周数是
SL Date Weeknumber
---------------------------
1) 21/09/2017 - 3
2) 28/09/2017 - 4
3) 23/03/2017 - 4
4) 29/06/2017 - 5
5) 15/03/2018 - 3
6) 28/03/2018 - 4
7) 29/03/2018 - 5
提前致谢
答案 0 :(得分:2)
假设你的输入表就像
TableOfDates([SL] int,[Date] date)
以下查询将给出正确的周数
set datefirst 4
go
--create table TableOfDates([SL] int,[Date] datetime)
--insert into TableOfDates values
--(1,'09-21-2017'),
--(2,'09-28-2017'),
--(3,'03-23-2017')
select
t.Date,DATEPART(wk,t.[Date])- DATEPART(wk,DATEADD(d,1,DATEADD(m,-1,EOMONTH(t.[Date]))))
from TableOfDates t
go
--drop table TableOfDates
set datefirst 7
go
对于SQL SERVER 2008版本
您可以使用以下查询
select
t.Date,DATEPART(wk,t.[Date])- DATEPART(wk,cast(dateadd(m,datediff(m,0,t.date),0) as date))
from TableOfDates t
<强>解释强>
默认设置Datefirst设置为7.我们指示SQL服务器使用星期四(4)作为星期的开始。 请参阅MSDN documentation。
现在,因为周年数是从年初开始计算的,我们需要每月工作周数,我们计算当前日期和月初的周数,它们的差异给出了每月周数
最后,我们将datefirst设置为默认值7
参见附件
答案 1 :(得分:2)
这应该会给你你想要的东西。有点疯狂,我知道,但它确实有效:
create table #months (date date);
insert into #months
values ('20170921')
, ('20170928')
, ('20170323')
, ('20170629')
, ('20180315')
, ('20180328')
, ('20180329');
select date
, case
when weeksdif * 7 <= daysdiff
then weeksdif + 1
else weeksdif
end [week nr]
from (
select *
, wk - wk_startOfMonth [weeksdif]
, DATEDIFF(DAY, startOfMonth, date) [daysdiff]
from (
select *
, DATEPART(wk, startOfMonth) wk_startOfMonth
, DATEPART(WEEKDAY, startOfMonth) wkd_startOfMonth
from (
select *
, DATEPART(wk, date) wk
, DATEPART(weekday, date) wkd
, cast( (CAST(YEAR(date) as varchar(8))
+ RIGHT('0' + CAST(month(date) as varchar(8)), 2)
+ '01') as date) startOfMonth
from #months
) result_set
) result_set
) result_set
order by date;
答案 2 :(得分:1)
使用DATAFIRST。
来自MSDN: -
将一周的第一天设置为1到7之间的数字。
╔═══════════════════════════╦══════════════════════════╗ ║ Value ║ First day of the week is ║ ╠═══════════════════════════╬══════════════════════════╣ ║ 1 ║ Monday ║ ║ 2 ║ Tuesday ║ ║ 3 ║ Wednesday ║ ║ 4 ║ Thursday ║ ║ 5 ║ Friday ║ ║ 6 ║ Saturday ║ ║ 7 (default, U.S. English) ║ Sunday ║ ╚═══════════════════════════╩══════════════════════════╝
所以使用下一个代码: -
Set DATEFIRST 4
DECLARE @DATE DATETIME
SET @DATE = '2017-09-21'
SELECT DATEPART(WEEK, @DATE) -
DATEPART(WEEK, DATEADD(MM, DATEDIFF(MM,0,@DATE), 0)) AS WEEK_OF_MONTH
<强>结果: - 强>
3