zoukankan      html  css  js  c++  java
  • 一个有意思的问题:如何根据一年中的第几周,查询出它周六和周日对应的日期

    在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-@@datefirstEnd As [星期六],
            
    @Date+Case When 7>=@@datefirst Then 7-@@datefirst Else 7+(7-@@datefirstEnd As [星期日]

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

     

  • 相关阅读:
    纯CSS垂直居中的四种解决方案
    UTF-8 UTF-16 UTF-32 最根本的区别?
    js中==和===区别
    关于端口的定义, 为什么要有端口
    变量命名规范
    使用枚举enum
    js中, 用变量或对象作为if或其他条件的表达式
    使用jquery-panzoom来实现图片或元素的放大缩小
    使用mescroll来实现移动端页面上拉刷新, 下拉加载更多功能
    angularjs常用事件
  • 原文地址:https://www.cnblogs.com/wghao/p/2008860.html
Copyright © 2011-2022 走看看