27,579
社区成员




create function dbo.getMonthWeek(@d date)
returns varchar(20)
as
begin
declare @returns varchar(20),
@monthfirstDay date,
@firstMondy date
select @monthfirstDay=left(convert(varchar,@d,23),7)+'-01'
if not exists(select 1
from master.dbo.spt_values
where type=N'P' and number between 0 and datediff(d,@monthfirstDay,@d)
and datepart(dw,dateadd(d,number,@monthfirstDay))=2)
begin
select @monthfirstDay=dateadd(mm,-1,@monthfirstDay)
end
;with t as(select 'days'=dateadd(d,number,@monthfirstDay)
from master.dbo.spt_values
where type=N'P' and number<=7)
select @firstMondy=min([days])
from t
where datepart(dw,[days])=2
select @returns=rtrim(datepart(mm,@monthfirstDay))+'月'
+'的第'+rtrim(datediff(d,@firstMondy,@d)/7+1)+'周'
return @returns
end
-- 2016-1-1 是12月的第4周
select dbo.getMonthWeek('2016-1-1') 'result'
/*
result
--------------------
12月的第4周
(1 row(s) affected)
*/
-- 2016-1-4 开始是第一周
select dbo.getMonthWeek('2016-1-4') 'result'
/*
result
--------------------
1月的第1周
(1 row(s) affected)
*/
-- 2016-4-7 开始是第一周
select dbo.getMonthWeek('2016-4-7') 'result'
/*
result
--------------------
4月的第1周
(1 row(s) affected)
*/
SELECT @@DATEFIRST--SET DATEFIRST 指定一周中的第一天。美国英语中默认 7 对应星期日。
--针对以上默认 7 对应星期日
DECLARE @Dt DATE='2016-4-1'
SELECT RTRIM(CASE WHEN DATEPART(dw,DATEADD(dd,-1,@Dt))>=5 THEN MONTH(DATEADD(dd,-7,@dt)) ELSE MONTH(@dt) END)+'月的第'
+RTRIM(CASE WHEN DATEPART(dw,DATEADD(dd,-DAY(@Dt),@Dt))>=5 THEN 0 ELSE 1 END+CASE WHEN DATEPART(dw,DATEADD(dd,-1,@Dt))>=5 THEN CEILING(DAY(DATEADD(dd,-7,@dt))/7.0) ELSE CEILING(DAY(@dt)/7.0) END)
+'周'