获取所有在星期二产生的订单

标识指定日期的星期数,即计算出该日期是星期几,比看上去要复杂的多,要返回Northwind数据库Orders表中所有星期二发生的订单,在datepart函数中使用weekday单位,可以提取出指定日期datetime值得星期数(从1到7),然而从指定日期datetime中得到的星期数依赖于会话选项DATEFIRST的设置,该设置确定一周的 第一天,如果指定为1则表示星期一是一周的第一天,如果指定为2则标识星期二是一周的第一天,以此类推。

如果没有显式的设置DATEFIRST,会话将根据语言设置,隐式的设置这一选项。你可能不想更改设置,这样可以避免影响到会话中依赖于该设置的其他代码,作为替代方法,DATENAME标识星期数也无法解决该问题,因为改方法也依赖于你的语言设置。

 

考虑下DATEFIRST设置的值f和星期数d成反比,如果f增加n则d减少n,如果DATEFIRST设置为1,表示星期一是一周的第一天,则指定datetime值是星期二,则DATEPART函数返回的星期数是2,现在把DATEFIRST的值加1,设置为2,表示星期二是一周的第一天,则DATEPART函数返回的星期数将减少1,即为1.

通过@@DATEFIRST获取会话中DATEFIRST的值,DATEFIRST设置的值和DATEPART返回的星期数成反比,把@@DATEFIRST的值添加到指定时间DATETIME中去,这样就抵消了DATEFIRST设置的影响,以2011-8-12 为例,该日期是星期五,把DATEFIRST设置为任意值之后,执行

SELECT  DATEPART(WEEKDAY, CAST('2011-8-12' AS DATETIME) + @@DATEFIRST)

结果是6,与设置为7是一样的,

SELECT  DATEPART(WEEKDAY, CAST('2011-8-12' AS DATETIME) + @@DATEFIRST - 1)

这样,不管DATEPART怎么设置,输入的日期是星期几则返回几.

这样的问题的解决方案如下:

   1:  USE Northwind
   2:  SELECT  *
   3:  FROM    dbo.Orders
   4:  WHERE   DATEPART(weekday, OrderDate + @@DATEFIRST - 1) = 2
 

还有一种很棒的方法,一个日期是星期二,意味着该日期与另一个是星期二的日期相差的天数可以被7整除,对于这类问题,利用参照日期是个不错的注意,我们很容易知道1900-01-01是星期一,那么,就像这样:

   1:  SELECT  *
   2:  FROM    dbo.Orders
   3:  WHERE   DATEDIFF(DAY, '19000102', OrderDate) % 7 = 0
posted @ 2011-08-12 15:04  梅子黄时雨  阅读(237)  评论(0编辑  收藏  举报