Способ сделать это следующим образом:
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
;