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
  • 相关阅读:
    牛牛的揠苗助长(二分)
    树型DP简单入门
    Rational Ratio(一道思维题)
    Tima goes to Xentopia(条件最短路)
    中国剩余定理
    求解逆元的三种方法
    samba 基本配置及自定义控制
    vue之虚拟DOM、diff算法
    vue-cli3构建ts项目
    VMware+node+nginx+vue
  • 原文地址:https://www.cnblogs.com/Junelee1211/p/2136277.html
Copyright © 2011-2022 走看看