Может кто-нибудь объяснить этот SQL-запрос ясно - PullRequest
0 голосов
/ 18 октября 2019

Запрос исключает выходные. В запросе:

  1. Что делает * 2 в (DATEDIFF(wk, Startdate,Enddate) * 2)
  2. Здесь суббота, как это будет минус (суббота не упоминается) (CASE WHEN DATENAME(dw, Startdate) = 'Sunday' THEN 1 ELSE 0 END)
  3. Вот как воскресенье будет минус (воскресенье не упомянуто) (CASE WHEN DATENAME(dw, Enddate) = 'Saturday' THEN 1 ELSE 0 END)

В разнице в датах (wk, startdate, enddate) * 2) вот как поиск и исключение выходных точно.

Я думаю, что (20 дней- (20/7 = 2,6 * 2 = 5,8 (округление до 6) -0-0) кратко (20-6-0-0 = 14 дней) правильно. Но как именно он идентифицировал сби солнце. Я прав или нет. Мой вопрос, почему умножение на 2, почему не может с 3 или 4?

Запрос работает правильно. Я пропускаю вещи в запросе, чтобы понять. Пожалуйста, посмотрите запроси объясни ясно.

SELECT
    Startdate, Enddate,
    (DATEDIFF(dd, Startdate, Enddate)) -
        (DATEDIFF(wk, Startdate, Enddate) * 2) -
        (CASE WHEN DATENAME(dw, Startdate) = 'Sunday' THEN 1 ELSE 0 END) -
        (CASE WHEN DATENAME(dw, Enddate) = 'Saturday' THEN 1 ELSE 0 END) AS workingdays 
FROM
    EMP_Table;

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Поскольку pr DATEDIFF () вернет difference между двумя датами с заданным интервалом,

и DATENAME () вернет определенную часть датыкоторый здесь dw вернет weekday может в любой день недели, например Sunday, Monday и т. д.

Теперь выполнение запроса:

Например:

Startdate='2019/10/6' и Enddate='2019/10/12'

DATEDIFF(dd, Startdate, Enddate) даст 6

DATEDIFF(wk, Startdate, Enddate) даст 0 и есть 2 дней weekend, поэтому 0*2=0

CASE WHEN DATENAME(dw, Startdate) = 'Sunday' THEN 1 ELSE 0 END даст 1, потому что это Sunday и то же, что и для Enddate, это 1 из-за Saturday

Так что окончательное уравнение равно workingdays=(6-0-1-1) так что результат будет workingdays=4

0 голосов
/ 18 октября 2019

Строка за строкой:

Сначала получите необработанное количество дней между датами:

(DATEDIFF(dd, Startdate,Enddate))

Вычтите количество выходных дней, которое будет числом недель, умноженных на 2

-(DATEDIFF(wk, Startdate,Enddate )*2)

Настройка для случая, когда датой начала является воскресенье

-(CASE WHEN DATENAME(dw, Startdate) = 'Sunday' THEN 1 ELSE 0 END)

Настройка для случая, когда датой окончания является суббота

-(CASE WHEN DATENAME(dw, Enddate) = 'Saturday' THEN 1 ELSE 0 END)         
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...