ここに1つの方法です平日ではない日付を生成するためにCROSS APPLY
を使用し、その後、各日付の月のDATENAME
でグループ化します。
DECLARE @TABLE TABLE (Date1 DATE, Date2 DATE); -- Days field doesn't matter.
INSERT @TABLE(Date1, Date2) VALUES
('2017-01-25', '2017-02-03');
WITH CTE1(N) AS (SELECT 1 FROM (VALUES (1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) A(B)),
CTE2(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 FROM CTE1 A CROSS JOIN CTE1 B CROSS JOIN CTE1) -- Generate numbers 0-999.
SELECT Periode = DATENAME(MONTH, D.Dates),
Days = COUNT(*)
FROM @TABLE T
CROSS APPLY
(
SELECT Dates = DATEADD(DAY, C.N, T.Date1)
FROM CTE2 C
WHERE C.N <= DATEDIFF(DAY, T.Date1, T.Date2) -- Generate all dates between Date1 and Date2.
AND DATEPART(WEEKDAY, DATEADD(DAY, C.N, T.Date1)) NOT IN (1, 7) -- Where the day isn't Saturday/Sunday.
) D
GROUP BY DATENAME(MONTH, D.Dates), DATEPART(MONTH, D.Dates)
ORDER BY DATEPART(MONTH, D.Dates)
;
編集:ここで実際のニーズについてのコメントを1として
、これはあなたがDATETIME
列に基づいて、月内の日の実際の量をうまくしたい方法です:
DECLARE @TABLE TABLE (Date1 DATETIME, Date2 DATETIME); -- Days field doesn't matter.
INSERT @TABLE(Date1, Date2) VALUES
('2017-01-25 15:00:00.000', '2017-02-03 03:00:00.000');
WITH CTE1(N) AS (SELECT 1 FROM (VALUES (1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) A(B)),
CTE2(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 FROM CTE1 A CROSS JOIN CTE1 B CROSS JOIN CTE1) -- Generate numbers 0-999.
SELECT Periode = DATENAME(MONTH, D.Date1),
Days = SUM(DATEDIFF(HOUR, D.Date1, D.Date2))/24.0 -- Total hours in month/24.0 for the number of days.
FROM @TABLE T
CROSS APPLY -- Calculate the start and end of each day within a the period.
(
SELECT Date1 = CASE C.N WHEN 0 THEN T.Date1 ELSE DATEADD(DAY, DATEDIFF(DAY, 0, DATEADD(DAY, C.N, T.Date1)), 0) END, -- Start of each day.
Date2 = CASE WHEN C.N = DATEDIFF(DAY, T.Date1, T.Date2) THEN T.Date2 ELSE DATEADD(DAY, DATEDIFF(DAY, 0, DATEADD(DAY, C.N, T.Date1)), 1) END -- End of each day.
FROM CTE2 C
WHERE C.N <= DATEDIFF(DAY, T.Date1, T.Date2)
) D
GROUP BY DATENAME(MONTH, D.Date1), DATEPART(MONTH, D.Date1)
ORDER BY DATEPART(MONTH, D.Date1)
;
サンプルデータでは、2月の1日で6.375日(25日から9時間、9時間から25日)、2.125日(2日から3日間は3時間)合計8.5日間が作成されます。
あなたはテーブルのデータが不完全に見える – sumit
平日のカウントのように? – ZLK
平日はまだカウント –