虚心请教!如何得到某月的第N个星期的第一天及最后一天的日期?

haochin 2009-10-31 03:59:09
如何得到某月的第N个星期的星期一及星期日的日期?

例如:2009年10月的第一个星期的第一天是2009-10-01 第一个星期的最后一天是2009-10-04
第二个星期的第一天是2009-10-05 第二个星期的最后一天是2009-10-11
第五个星期的第一天是2009-10-26 第五个星期的最后一天是2009010-31



虚心请教!
...全文
263 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bancxc 2009-10-31
  • 打赏
  • 举报
回复
--才写出来

set datefirst 1
declare @d as datetime
select @d = GETDATE()
select
第几周= ROW_NUMBER() over(order by DATEPART(week,dt)),
第一天=min(dt) ,
最后一天=max(dt)
From
(
select dt=DATEADD(Day,number,convert(varchar(8),@d,120)+'01')
from master..spt_values P
where type='p' and number <=31 and
MONTH(DATEADD(day,number,Convert(varchar(8),@d,120)+'01'))=MONTH(GETDATE()) --判断是否10月
and (
DATEPART(WeekDay,DATEADD(day,number,Convert(varchar(8),@d,120)+'01'))=1 --星期1
or DATEPART(WeekDay,DATEADD(day,number,Convert(varchar(8),@d,120)+'01'))=7 --星期7
or DATEADD(day,number,Convert(varchar(8),@d,120)+'01')=Convert(varchar(8),@d,120)+'01'--本月第一天
or DATEADD(day,number,Convert(varchar(8),@d,120)+'01')=Dateadd(day,-1,DateAdd(Month,1,Convert(varchar(8),@d,120)+'01'))--本月最后一天
)
) V
group by DATEPART(week,dt)
set datefirst 7


/*第几周 第一天 最后一天
-------------------- ----------------------- -----------------------
1 2009-10-01 00:00:00.000 2009-10-04 00:00:00.000
2 2009-10-05 00:00:00.000 2009-10-11 00:00:00.000
3 2009-10-12 00:00:00.000 2009-10-18 00:00:00.000
4 2009-10-19 00:00:00.000 2009-10-25 00:00:00.000
5 2009-10-26 00:00:00.000 2009-10-31 00:00:00.000

(5 行受影响)


*/
feixianxxx 2009-10-31
  • 打赏
  • 举报
回复
declare @year int,@Month int,@n int
set @year=2009
set @Month=10
set @n=2;
with cte as (
select 日期,
星期数=datepart(WEEK,日期+@@DATEFIRST-1)
from(
select DATEADD(DAY,number,cast(rtrim(@year)+'-'+rtrim(@month)+'-'+'01' as datetime)) as 日期
from master..spt_values n
where type='p' and number <=31 and MONTH(DATEADD(day,number,cast(rtrim(@year)+'-'+rtrim(@month)+'-'+'01' as datetime)))=@Month) l)

select CONVERT(varchar(10),日期,120) as 日期
from (
select DENSE_RANK () over (order by 星期数) as rn ,* from cte ) k
where rn=@n
/*
日期
----------
2009-10-05
2009-10-06
2009-10-07
2009-10-08
2009-10-09
2009-10-10
2009-10-11

*/
feixianxxx 2009-10-31
  • 打赏
  • 举报
回复
....梁的有问题...
jnet007 2009-10-31
  • 打赏
  • 举报
回复
顶...
guguda2008 2009-10-31
  • 打赏
  • 举报
回复
一时也没好的思路,梁哥的方法应该可行,反正一个月最多31天
haochin 2009-10-31
  • 打赏
  • 举报
回复
小梁的果然经典啊。。

谢谢。。
luoyoumou 2009-10-31
  • 打赏
  • 举报
回复
----按楼主的意思:把星期日算成一星期的最后一天?
liangCK 2009-10-31
  • 打赏
  • 举报
回复
SET DATEFIRST 1;

;WITH Liang AS
(
SELECT DATEADD(day,number,'2009-10-01') AS date,
DATEPART(week,DATEADD(day,number,'2009-10-01')) AS week,
DENSE_RANK() OVER(ORDER BY DATEPART(week,DATEADD(day,number,'2009-10-01'))) AS rowid
FROM master.dbo.spt_values
WHERE type = 'p' AND number <=31
AND MONTH(DATEADD(day,number,'2009-10-01'))=10
)
SELECT rowid,MIN(date) AS week_min,MAX(date) AS week_max FROM Liang GROUP BY rowid

/*
rowid week_min week_max
-------------------- ----------------------- -----------------------
1 2009-10-01 00:00:00.000 2009-10-04 00:00:00.000
2 2009-10-05 00:00:00.000 2009-10-11 00:00:00.000
3 2009-10-12 00:00:00.000 2009-10-18 00:00:00.000
4 2009-10-19 00:00:00.000 2009-10-25 00:00:00.000
5 2009-10-26 00:00:00.000 2009-10-31 00:00:00.000

(5 行受影响)
*/
liangCK 2009-10-31
  • 打赏
  • 举报
回复
最简单的...把2009-10月的日期穷举出来.
然后得到week..取min和max就可以
haochin 2009-10-31
  • 打赏
  • 举报
回复
顶起。。。

34,597

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧