通过SQL得到某年内每周的开始日期和结束日期

  • Post author:
  • Post category:其他


示例效果为:

得到某年内每周的开始日期和结束日期

每周以周日为第一天

一周以至少还有四天为计



2004/01/01 是已经周四

那么2004年的第一周从2004/01/04开始

2007/12/31 是周二

那么2007年的最后一周只到2007/12/19开始

那么2008年的第一周从2007/12/30开始

相关代码如下:

————–

1.tWeek表

ContractedBlock.gif
ExpandedBlockStart.gif




None.gif

CREATE




TABLE




[


tWeek


]


(

None.gif


[


tSeqID


]




[


int


]




IDENTITY


(


1


,


1


)


NOT




NULL


,

None.gif


[


tYear


]




[


int


]




NULL


,

None.gif


[


tWeekSeq


]




[


int


]




NULL


,

None.gif


[


tStartDate


]




[


datetime


]




NULL


,

None.gif


[


tEndDate


]




[


datetime


]




NULL


,

None.gif


CONSTRAINT




[


PK_tWeek


]




PRIMARY




KEY




CLUSTERED



None.gif
(

None.gif


[


tSeqID


]



None.gif
)


ON




[


PRIMARY


]



None.gif
)


ON




[


PRIMARY


]



None.gif


GO

2.生成相关数据的SQL语句

ContractedBlock.gif
ExpandedBlockStart.gif




None.gif

DECLARE




@SYear




int







开始年份



None.gif


DECLARE




@EYear




int







结束年份



None.gif



None.gif


SET


DATEFIRST


7







设周日为每周第一天



None.gif


SET




@SYear




=




2004



None.gif


SET




@EYear




=




2010



None.gif





周以至少四天为计



None.gif



判断第一周的开始与结束



None.gif


DECLARE




@YSDate




DATETIME







年的第一周开始时间



None.gif


DECLARE




@YEDate




DATETIME







年的最后周结束时间



None.gif


DECLARE




@WSDate




DATETIME







用于循环的年内某周的开始日期



None.gif


DECLARE




@WEDate




DATETIME







用于循环的年内某周的开始日期



None.gif


DECLARE




@IWeek




int







当前周为本年的第几周



None.gif


WHILE




@SYear


<=


@EYear



None.gif


BEGIN





BEGIN WHILE YEAR



None.gif



None.gif


SET




@YSDate


=




CAST


( (


CAST


(


@SYear




AS




VARCHAR


(


4


) )


+





/01/01





)


AS




DATETIME


)

None.gif


SET




@YEDate


=




CAST


( (


CAST


(


@SYear




AS




VARCHAR


(


4


) )


+





/12/31





)


AS




DATETIME


)

None.gif


SET




@IWeek


=


1



None.gif

None.gif


IF




DATEPART


(DW,


@YSDate


)


>


4





第一周已不足4天 从第二周开始算第一周



None.gif




BEGIN



None.gif


SET




@YSDate


=




DATEADD


(


DAY


,(


8





DATEPART


(DW,


@YSDate


)) ,


@YSDate


)





本周开始日期



None.gif




END



None.gif


ELSE





第一周足4天 从本周日算第一天



None.gif




BEGIN



None.gif


SET




@YSDate


=




DATEADD


(


Day


,(





(


DATEPART


(DW,


@YSDate


)





1


)) ,


@YSDate


)

None.gif


END



None.gif

None.gif


SET




@WSDate




=




@YSDate



None.gif


SET




@WEDate


=




DATEADD


(


DAY


,


6


,


@WSDate


)





本周结束日期



None.gif



None.gif


WHILE




DATEDIFF


(


DAY


,


@WSDate


,


@YEDate


)


>=


4



None.gif


BEGIN



None.gif





执行Insert



None.gif




INSERT




INTO


tWeek(tYear, tWeekSeq, tStartDate, tEndDate)

None.gif


VALUES


(


@SYear


,


@IWeek


,


@WSDate


,


@WEDate


)

None.gif





重置参数



None.gif




SET




@IWeek


=


@IWeek


+


1



None.gif


SET




@WSDate


=


@WSDate


+


7



None.gif


SET




@WEDate


=


@WEDate


+


7



None.gif


END



None.gif

None.gif


SET




@SYear


=


@SYear


+


1



None.gif

None.gif


END





END WHILE YEAR

3.生成的tWeek表内部分数据示例

顺序号  年份   第几周    该周开始日期           该周结束日期

tSeqID  tYear  tWeekSeq  tStartDate             tEndDate

1 2004 1 2004-01-04 00:00:00.000 2004-01-10 00:00:00.000

2 2004 2 2004-01-11 00:00:00.000 2004-01-17 00:00:00.000



208 2007 52 2007-12-23 00:00:00.000 2007-12-29 00:00:00.000

209 2008 1 2007-12-30 00:00:00.000 2008-01-05 00:00:00.000