2014-01-09 2 views
0

Мне нужна помощь, чтобы понять определенную строку в коде. Код берет обороты каждого понедельника в 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

Какие СУБД вы используете? –

+2

'%' - оператор мод. – Appulus

ответ

1

Modulo or % оператора такой же, как во многих языках программирования. Он возвращает остаток после деления.

Функция DATEDIFF выполняет две даты и возвращает разницу в указанной датеpart, которая в ваш запрос представляет собой дни, представленные dd.

Также 0 как дата конвертирования в 1/1/1900, которая является Monday. Таким образом, ваш запрос вычисляет дни между 1/1/1900 и полем DATUM в днях, и если его Мод равен 0, то DATUM - понедельник.

+0

Привет, извините за поздний ответ, но спасибо, это помогло много :) – user3084375

0

Вы могли бы просто сказать:

datename(weekday,<datetime-value>) 

который будет возвращать «Понедельник», «Вторник», «Среда», и т.д. Проблема с этим подходом является то, что возвращаемое значение локализованной. Если язык 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 
+0

тоже здесь спасибо за ваши комментарии !!! – user3084375

Смежные вопросы