如何在每个星期一的日期之外

时间:2014-01-09 17:37:15

标签: sql sql-server tsql datediff

我需要一些帮助来理解代码中的某一行。该代码记录了2010年每个星期一的失误,并在最后一行将所有失误汇总为一个。

以下是代码:

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

获得所有星期一的

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

非常感谢:)

2 个答案:

答案 0 :(得分:1)

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

DATEDIFF函数占用两个日期,并返回指定日期部分的差异,在您的查询中,dd表示的日期。

同样0作为日期转换为1/1/1900恰好是Monday。因此,您的查询计算的是天数为1/1/1900和DATUM字段的天数,如果其Mod为0,则DATUM为星期一。

答案 1 :(得分:0)

你可以简单地说:

datename(weekday,<datetime-value>)

将返回“星期一”,“星期二”,“星期三”等。此方法的问题是返回的值是本地化。如果更改了SQL Server的语言,则对“Monday”的测试将失败。

此表达式始终有效:

( @@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