Рабочие дни T-SQL в текущем квартале и рабочие дни в текущем квартале - PullRequest
0 голосов
/ 17 ноября 2018

Каков наилучший метод для определения количества рабочих дней (понедельник-пятница) в текущем квартале в дополнение к тому, сколько рабочих дней прошло в текущем квартале?Это для T-SQL / MS SQL

У меня есть текущее общее количество дней, просто нужно удалить выходные ...

datediff(dd, dateadd(qq, datediff(qq,0, getdate()),0), dateadd(qq, datediff(qq,0, getdate()) + 1 ,0)) as [Days in Quarter]

1 Ответ

0 голосов
/ 17 ноября 2018

Способ сделать это следующим образом:

select
       dates.*

     , (DATEDIFF(dd, startofperiod, endofperiod) + 1)
      -(DATEDIFF(wk, startofperiod, endofperiod) * 2)
      -(CASE WHEN DATENAME(dw, startofperiod) = 'Sunday' THEN 1 ELSE 0 END) 
      -(CASE WHEN DATENAME(dw, endofperiod) = 'Saturday' THEN 1 ELSE 0 END)
      as wkdaysinperiod

     , (DATEDIFF(dd, startofperiod, today) + 1)
      -(DATEDIFF(wk, startofperiod, today) * 2)
      -(CASE WHEN DATENAME(dw, startofperiod) = 'Sunday' THEN 1 ELSE 0 END) 
      -(CASE WHEN DATENAME(dw, today) = 'Saturday' THEN 1 ELSE 0 END)
      as wkdaystodate
from (
    select 
          dateadd(qq, datediff(qq,0, getdate()),0)                     as startofperiod
        , dateadd(dd,-1,dateadd(qq, datediff(qq,0, getdate()) + 1 ,0)) as endofperiod
        , convert(date,getdate()) as today
    ) as Dates
;

Метод, рассмотренный выше, предполагает использование английского языка, поэтому, если он не подходит для модуля, можно удалить эту зависимость, как показано ниже.

«Базовая дата» в SQL Server - 1900-01-01, то есть понедельник, поэтому оставшееся число дней после этой даты после деления на 7, 0 - понедельник, 1, вторник, ... 6 воскресенье. Это верно независимо от настроек сервера datefirst.

select
       dates.*, ca.*

     , (DATEDIFF(dd, startofperiod, endofperiod) + 1)
      -(DATEDIFF(wk, startofperiod, endofperiod) * 2)
      -(CASE WHEN periodstartdaynum = 6 THEN 1 ELSE 0 END) /* Sunday */
      -(CASE WHEN periodenddaynum   = 5 THEN 1 ELSE 0 END) /* Saturday */
      as wkdaysinperiod

     , (DATEDIFF(dd, startofperiod, today) + 1)
      -(DATEDIFF(wk, startofperiod, today) * 2)
      -(CASE WHEN periodstartdaynum = 6 THEN 1 ELSE 0 END) /* Sunday */
      -(CASE WHEN todaydaynum       = 5 THEN 1 ELSE 0 END) /* Saturday */
      as wkdaystodate
from (
    select 
          dateadd(qq, datediff(qq,0, getdate()),0)                     as startofperiod
        , dateadd(dd,-1,dateadd(qq, datediff(qq,0, getdate()) + 1 ,0)) as endofperiod
        , convert(date,getdate()) as today
    ) as Dates
cross apply (
    select
          datediff(dd,0,startofperiod) % 7 as periodstartdaynum
        , datediff(dd,0,endofperiod) % 7   as periodenddaynum
        , datediff(dd,0,today) % 7         as todaydaynum
    ) ca
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...