zoukankan      html  css  js  c++  java
  • 获取所有在星期二产生的订单

    标识指定日期的星期数,即计算出该日期是星期几,比看上去要复杂的多,要返回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
  • 相关阅读:
    [ERR] Node 10.211.55.8:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    PAT A1137 Final Grading (25 分)——排序
    PAT A1136 A Delayed Palindrome (20 分)——回文,大整数
    PAT A1134 Vertex Cover (25 分)——图遍历
    PAT A1133 Splitting A Linked List (25 分)——链表
    PAT A1132 Cut Integer (20 分)——数学题
    PAT A1130 Infix Expression (25 分)——中序遍历
    PAT A1142 Maximal Clique (25 分)——图
    PAT A1141 PAT Ranking of Institutions (25 分)——排序,结构体初始化
    PAT A1140 Look-and-say Sequence (20 分)——数学题
  • 原文地址:https://www.cnblogs.com/Junelee1211/p/2136277.html
Copyright © 2011-2022 走看看