2017-03-15 7 views
1

昨日の連続する日付のいずれかがある場合、私の休日のテーブルから連続した日付をフィルタリングしたいと思います。以下は行番号で連続した日付を取得する私のコードです。SQL Serverの連続する日付のフィルタリング

SELECT 
    RW = ROW_NUMBER() OVER(PARTITION BY GRP ORDER BY HolidayDate), 
    HolidayDate 
FROM 
    (SELECT 
     HolidayDate, 
     DATEDIFF(Day, '1900-01-01', HolidayDate) - ROW_NUMBER() OVER (ORDER BY HolidayDate) AS GRP, 
     HolidayType 
    FROM 
     Holiday) A 
ORDER BY 
    HolidayDate 

たとえば、昨日の日付は03/14/2017です。この日付を含む連続した休暇がある場合、私はホリデーテーブルからデータを取得する必要があります。

出力は他の一致がない場合さて、あなたはほとんどあり

03/12/2017 
03/13/2017 
03/14/2017 
+1

明確にしてください。 「この日付に連動する連休がある場合はどういう意味ですか?」3/14と3/15がともに休日であった場合はどうですか?このテーブルには休日のみが含まれていますか?実際の世界の例が役立つかもしれません。クリスマスイブとクリスマスの両方が休日である状況について話していますか?出力はクリスマスイブだけでなければならないとあなたは言っていますか?または両方?どちらか?それらの2つを除く毎日? –

答えて

2

以下のように、それは日付が表示されますnullにする必要があります!

"yesterday"をパラメータとして定義すると、簡単に見つけることができます。

CREATE TABLE Holiday(
    HolidayDate SMALLDATETIME PRIMARY KEY, 
    HolidayType VARCHAR(20) 
); 

INSERT INTO Holiday VALUES 
    ('2016-12-25', 'A'), ('2016-12-26', 'A'), ('2017-01-01', 'A'), 
    ('2017-04-12', 'A'), ('2017-04-13', 'A'), ('2017-04-14', 'A'); 

DECLARE @yesterday SMALLDATETIME; 
SET @yesterday = '2017-04-13'; -- belongs to a group of consecutive holidays 
-- SET @yesterday = '2017-01-01'; -- isolated holiday 
-- SET @yesterday = '2017-02-10'; -- not a holiday 

; WITH groups as 
(
SELECT 
    HolidayDate, 
    DATEDIFF(Day, '1900-01-01', HolidayDate) 
    - ROW_NUMBER() OVER (ORDER BY HolidayDate) AS GRP, 
    HolidayType 
FROM Holiday 
), 
consecutive as (
    SELECT GRP FROM groups GROUP BY GRP HAVING COUNT(*) > 1 
) 
SELECT DISTINCT g2.HolidayDate, g2.HolidayType 
FROM consecutive c 
JOIN groups g1 ON c.GRP = g1.GRP 
JOIN groups g2 ON g1.GRP = g2.GRP 
WHERE g1.HolidayDate = @yesterday; 
+0

まさに私が探していたもの。おかげで多くのGiorgos Altanis – Ramya

+0

あなたは歓迎、実際にあなたが私を助けてくれました:-) –

+0

それはあなたが言っていいです:) – Ramya

関連する問題