--上面的稍微有一点问题:就是每月的一号如果是星期天的话,就要用CASE判断一下,下面完全OK!!! 我的思路是:先算出每月一号是星期几,然后用:8 - 星期几(如星期天:1,星期六:7)+ 7就得到第二个星期天的日期了。select dateadd(day, 8 - case when datepart(weekday,dateadd(day,- datepart(day,getdate())+1,getdate())) = 1 Then 8 else datepart(weekday,dateadd(day,- datepart(day,getdate())+1,getdate())) end
dateadd(dd,13-datepart(day,getdate()),getdate())
这一句实际上就是取每月的13号,那为什么要取13号那?有问题!
实际上你取的是每个月的第二个星期一,但是第二个星期一跟第二个星期天未必有必然的联系
一个月由周一开始 跟 由其他日子开始是不一样的
select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,13-datepart(day,getdate()),getdate()) ), -1)这样取的是周日 vivianfdlpw() 的方法没有问题
只是我想不出来为什么是13号?
如果是2005年的5月份的话,它的结果就是这个月的第二个星期天
而是第二个星期一???
第一个星期一的后六天不就是第二个周日吗!
-- 应是Set Datefirst 1Select Convert(char(8),getdate(),120)+Cast(15-datepart(w,Cast(convert(varchar(8),Getdate(),120)+'01' as datetime)) as char(2))
SELECT
CASE WHEN DATEPART(DD,DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,13-datepart(day,getdate()),getdate()) ), 0))=8
THEN
DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,13-datepart(day,getdate()),getdate()) ), 0)+6
ELSE
DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,13-datepart(day,getdate()),getdate()) ), 0)-1
END
select DATEADD(wk, DATEDIFF(wk,-1, dateadd(dd,14-datepart(day,getdate()),getdate()) ), -1)
第二个星期天肯定在8-14号之间,所以应该从14号往前推
coolingpipe(冷箫轻笛) 改的还是有问题,试一下2013-7-14(正好是星期天)就知道错在哪了
--求出每个月的第二个星期天是哪一天?select
dateadd(day, 8 - datepart(weekday,dateadd(day,- datepart(day,getdate())+1,getdate())) + 7 , dateadd(day,- datepart(day,getdate())+1,getdate()))
我的思路是:先算出每月一号是星期几,然后用:8 - 星期几(如星期天:1,星期六:7)+ 7就得到第二个星期天的日期了。select dateadd(day, 8 - case when datepart(weekday,dateadd(day,- datepart(day,getdate())+1,getdate())) = 1 Then 8
else
datepart(weekday,dateadd(day,- datepart(day,getdate())+1,getdate()))
end
+ 7 , dateadd(day,- datepart(day,getdate())+1,getdate()))
select next_day(last_day('?Date?'),2)+7 from dual
先取出上一个月的最后一天last_day
然后从上个月的最后一天开始找下一个周一next_day
加上7天就是每个月的第二个周一