我需要一些帮助来理解代码中的某一行。该代码记录了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
?
如果有人可以帮助我,那就太棒了。
非常感谢:)
答案 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