当前位置: 代码迷 >> Sql Server >> 计算当前日期为当月的第几周(按照星期一为一周的第一天)解决办法
  详细解决方案

计算当前日期为当月的第几周(按照星期一为一周的第一天)解决办法

热度:85   发布时间:2016-04-27 14:26:55.0
计算当前日期为当月的第几周(按照星期一为一周的第一天)
在sql server 2005星期日为一周的第一天,而需要的是按照星期一为一周的第一天。
在网上找了下,没发现计算当前日期为当月的第几周的函数,因此自己弄了个,但是觉得太麻烦,有没有比较简单的函数之类的.
SQL code
select getdate() as NowDay,((case when datepart(weekday,(cast(year(getdate()) as varchar(4))+'-' + cast(Month(getdate()) as varchar(2))+'-1')) - 1 = 0 then 7 else datepart(weekday,(cast(year(getdate()) as varchar(4))+'-' + cast(Month(getdate()) as varchar(2))+'-1')) - 1  end )-1 + day(getdate())/7)+1 as WeekDay/*按照星期一为一周的第一天来计算周数,SQLSERVER 2005是按照周日为一星期的第一天来计算1、首先取出当前日期所在月份的第一天;2、再取出本月第一天是星期几;3、根据本月第一天星期几来计算所在周数。如 2012-02-13 所在的月份为2月,那么2月1号即为星期三;4、3减去1再加上当前日期(如2012-02-13 ,则加上13);5、最后除以7加上1即为当前日期所在的周数*/



------解决方案--------------------
SQL code
--本周第一天   SELECT DATEADD(Day,1-(DATEPART(Weekday,getdate())+@@DATEFIRST-1)%7,getdate())  --or   select dateadd(wk, datediff(wk,0,getdate()), 0)  --本周第一天   select dateadd(wk, datediff(wk,0,getdate()), 6)    --上月第一天   SELECT CONVERT(CHAR(10),DATEADD(month,-1,DATEADD(dd,-DAY(GETDATE())+1,GETDATE())),111)  --上月最后一天   SELECT CONVERT(CHAR(10),DATEADD(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()),0)),111)+' 23:59:59'  --本月第一天   select dateadd(dd,-datepart(dd,getdate())+1,getdate())  --本月最后一天   select dateadd(dd,-datepart(dd,getdate()) ,dateadd(mm,1,getdate()))  --本月天数   select datediff(dd,dateadd(dd,-datepart(dd,getdate())+1,getdate()), dateadd(dd,-datepart(dd,getdate())+1,dateadd(mm,1,getdate())))  --or   select datepart(dd,dateadd(dd,-1,dateadd(mm,1,cast(cast(year(getdate()) as varchar)+'-'+cast(month(getdate()) as varchar)+'-01' as datetime))))    --下月第一天   select dateadd(dd,-datepart(dd,getdate())+1,dateadd(mm,1,getdate()))  --下月最后一天   SELECT CONVERT(CHAR(10),DATEADD(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+2,0)),111)+' 23:59:59'  --季度第一天   SELECT   DATEADD(qq,   DATEDIFF(qq,0,getdate()),   0)   --季度最后一天(直接推算法)   SELECT DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1+DATEPART(Quarter,getdate())*3-Month(getdate()),getdate()),120)+'1')  --季度的最后一天(CASE判断法)   select DATEADD(Month,DATEPART(Quarter,getdate())*3-Month(getdate()),getdate())    --本月第一个星期一   SELECT DATEADD(wk, DATEDIFF(wk, '', DATEADD(dd, 6 - DAY(getdate()), getdate())), '')   --去年最后一天   SELECT   dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))   --今年第一天   SELECT   DATEADD(yy,   DATEDIFF(yy,0,getdate()),   0)   --今年最后一天   SELECT  dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1,0))    --指定日期所在周的任意一天   SELECT DATEADD(Day,@number-DATEPART(Weekday,@dt),@dt)--5.指定日期所在周的任意星期几   --A.  星期天做为一周的第1天   SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt)  --B.  星期一做为一周的第1天   SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt)  ---周内的第几日   select datepart(weekday,getdate()) as 周内的第几日  --年内的第几周   select datepart(week,getdate()) as 年内的第几周  --年内的第几季   select datepart(quarter,getdate()) as 年内的第几季      --判断某天是当月的第几周的sql函数    CREATE   FUNCTION   WeekOfMonth(@day datetime)     RETURNS int  AS   begin    ----declare @day datetime   declare @num int  declare @Start datetime  declare @dd int  declare @dayofweek char(8)  declare @dayofweek_num char(8)  declare @startWeekDays int  ---set @day='2009-07-05'   if datepart(dd,@day)=1  return 1  else  set @Start= (SELECT   DATEADD(mm,   DATEDIFF(mm,0,@day),   0)) --一个月第一天的   set @dayofweek= (datename(weekday,@Start)) ---得到本月第一天是周几   set @dayofweek_num=(select (case @dayofweek when '星期一' then 2  when '星期二' then 3  when '星期三' then 4  when '星期四' then 5  when '星期五' then 6  when '星期六' then 7  when '星期日' then 1  end))  set @dayofweek_num= [email protected]_num+1 ---得到本月的第一周一共有几天   ---print @dayofweek_num      set @dd=datepart(dd,@day) ----得到今天是这个月的第几天   --print @dd   if @dd<[email protected]_num --小于前一周的天数   return 1  else   set @dd=@dd-@dayofweek_num  if @dd % 7=0       begin         set @[email protected] / 7          return @num+1                end     else --if @dd % 7<>0             set @[email protected] / 7  set @[email protected]+1+1         return @num  end
  相关解决方案