2017-01-17 1 views
-2

私が持っているテーブルのような出力にこれを有効にする方法私は、表示されているようにSQL Serverにテーブルを持っています - 希望の出力を得る方法?

Date1  | Date2  | Days 
------------------------------- 
2017-01-25 2017-02-03  8 

:2つの列の値に基づいて、指定した期間中の平日の数を生成することができ

Periode | Days 
-------------- 
January 5 
February 3 
+0

あなたはテーブルのデータが不完全に見える – sumit

+0

平日のカウントのように? – ZLK

+0

平日はまだカウント –

答えて

2

ここに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日間が作成されます。

+0

は大丈夫、それは仕事 が、どのようなら 日付1 = 2017年1月25日 日付2 = 2017年2月3日 日= 8.5 それは3.5 は、あなたがそれを修正することができます= 1月= 5 februariする必要がありますか? –

+0

@MahfudFoedなぜそれが8.5になるのでしょうか。なぜ5の代わりに0.5を3に追加するのですか? – ZLK

+0

ああ、あなたは3の代わりに5の代わりに0.5を右に入れます –

関連する問題