一个有意思的问题:如何根据一年中的第几周,查询出它周六和周日对应的日期...

在SQL 2005&SQL2008实现这一功能,首先要了解在MSSQL,一年中周的描述。

 

           图1

1.周的第一天,在MSSQL中,可以通过下面的值来描述周的第一天: 

美国英语中默认7为一周中的第一天。

通过@@Datefirst函数获取当前周的第一天:

Select   @@Datefirst   As   [ 周的第一天 ]

 

 2. 2011-01-01所在的周


Select   ' 2010-12-31 '   AS   [ 日期 ] , Datepart (week, ' 20101231 ' As   [ ]   Union   All
Select   ' 2011-01-01 ' , Datepart (week, ' 20110101 ' Union   All
Select   ' 2011-01-02 ' , Datepart (week, ' 20110102 ' Union   All
Select   ' 2011-01-03 ' , Datepart (week, ' 20110103 ' )

 

从这里可以看出,2011-01-01是属于2011年的第1周,2011-01-02就是第2周了 。

 

了解完上面两点内容描述,回到题目问题,这里取个案例,如要找第16周的周六日对应的日期,

3.按日历图找出第16周

Select   Dateadd (week, 16 - 1 , ' 20110101 ' [ 2011-01-01过15周后对应的日期 ]

 

 

 

 这里可以看出第16周,是从2011-04-10至2011-04-16,周六日日期是2011-04-1 & 2011-04-16

4.找出周六日出现在日历图中的规律

 为了更能简洁的说明,周六日在日历图(1-7位置)出现的规律,这里特别制作一些图形来描述:

 

 接下来,就周六日出现的位置,进行分析:

 

 

 从上面的图,可以简单分析出下面的算式:

 

 

从上面周六、周日位置的变化,可以观察出,无论如何,周六日位置都是在N1-N7之间,

 

当周的第一天为7,周六的位置变成了N7.这里可以假设,当@@Datefirst=7,周六的等式:

 

N1(D)+x+(6-7)=N1(D)+6    //x表示未知,N1(D)+6表示,当@@Datefirst=7,周的第一个日期+6天就等于周六的日期

 

x+(6-7)=+6

x=7

这里就可以得出,当@@Datefirst=7,周六的算式:N1(D)+7+(6-7)

 

 

分析周六日的算式,可以得出,

周六:If 6>=@@Datefirst Then N1(D)+0+(6-@@Datefirst) Else N1(D)+7+(6-@@Datefirs)

 

周日:If 7>=@@Datefirst Then N1(D)+0+(7-@@Datefirst) Else N1(D)+7+(7-@@Datefirs)

 

 为了更能说明变化的规律,再看看下面周四的情况:

 

 这里周四的位置变化,如倾斜的"N"字母,套用前面的算式可以得到:

 

 

 好了,接下来,很容易根据一年中的第几周,查询出它周六和周日对应的日期了

 

Declare   @Week   smallint ,
        
@Date   datetime

Set  datefirst  7   /*  设置周的第一天  */

Set   @Week = 16   /*  第几周  */

Set   @Date = Dateadd (week, @Week - 1 , rtrim ( year ( getdate ())) + ' 0101 ' ) - datepart (dw, rtrim ( year ( getdate ())) + ' 0101 ' ) + 1   /*  算出第16周的第一个日期  */

Select      @Week   As   [ ] ,
        
@Date + Case   When   6 >= @@datefirst   Then   6 - @@datefirst   Else   7 + ( 6 - @@datefirst End   As   [ 星期六 ] ,
        
@Date + Case   When   7 >= @@datefirst   Then   7 - @@datefirst   Else   7 + ( 7 - @@datefirst End   As   [ 星期日 ]

-- -另外一个不用Case的写法:
Select      @Week   As   [ ] ,
        
@Date + 7 * Sign ( 1 - Sign ( 6 - @@datefirst + 1 )) + ( 6 - @@datefirst As   [ 星期六 ] ,
        
@Date + 7 * Sign ( 1 - Sign ( 7 - @@datefirst + 1 )) + ( 7 - @@datefirst As   [ 星期日 ]

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值