【问题标题】:How to get every Monday out of a Date如何让每个星期一都过时
【发布时间】:2014-01-09 17:37:14
【问题描述】:

我需要一些帮助来理解代码中的某一行。代码获取 2010 年每个星期一的营业额,最后一行 in 将所有营业额汇总为一个。

代码如下:

SELECT
    CASE 
        WHEN GROUPING (DATUM) = 1 THEN 'Gesamtumsatz'
        ELSE CAST (DATUM AS VARCHAR (40))
    END AS MONTAGSDATEN,
    AVG (VERKAUFSWERT * VERKAUFSMENGE) as UMSATZ
FROM Data_Star_Awesome.dbo.VERKAUFSFAKTEN vk
    INNER JOIN DIMDATUM dimD on vk.DATUMID=dimD.DATUMID
WHERE DATEDIFF(dd,0, DATUM)%7=0 
    AND JAHR = 2010
GROUP BY ROLLUP (DATUM)

我不明白的问题行如下:

WHERE DATEDIFF(dd,0, DATUM)%7=0

我所知道的是,它需要日期变量的天数,但我没有得到 %7=0 部分。 DATEDIFF 函数应该回馈所有的日子。这些天是否保存在 % 占位符中?以及如何使用7=0 获得所有星期一?

如果有人可以帮助我,那就太好了。

非常感谢:)

【问题讨论】:

  • 您使用的是哪个 DBMS?
  • % 是 mod 运算符。

标签: sql sql-server tsql datediff


【解决方案1】:

Modulo or % 运算符与许多编程语言中的相同。它返回除法后的余数。

DATEDIFF 函数接受两个日期并返回指定日期部分中的差值,在您的查询中是dd 表示的日期。

还有0,因为日期转换为1/1/1900,恰好是Monday。因此,您的查询以天为单位计算 1/1/1900 和 DATUM 字段之间的天数,如果其 Mod 为 0,则 DATUM 为星期一。

【讨论】:

    【解决方案2】:

    你可以简单地说:

    datename(weekday,<datetime-value>)
    

    这将返回'Monday'、'Tuesday'、'Wednesday'等。这种方法的问题是返回的值是本地化的。如果更改 SQL 服务器的语言,您的“星期一”测试将失败。

    此表达式将始终有效:

    ( @@datefirst + ( datepart(weekday,today) - 1 ) ) % 7
    

    计算结果为 1-7,其中星期一始终为 1,星期日始终为 7,而与文化/语言设置或 @@datefirst 的当前值(由 set datefirst 设置)无关。

    然后我们可以将其转换为判别函数,产生 1 或 0 来表示日期是否为星期一:

    case ( @@datefirst + ( datepart(weekday,today) - 1 ) ) % 7 when 1 then 1 else 0 end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-06
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      相关资源
      最近更新 更多