2

週末や休日を除いて、SQL で date-diff を実行する際の問題に対する多くの回答を見つけました。私の問題は、日付の比較を行う必要があることです。作業日が親レコードの送信日から 3 日以内の子レコードはいくつありますか?

date-diff の回答のほとんどにはカレンダー テーブルが含まれます。date+3 を返すサブセレクトを作成できれば、残りは解決できると思います。しかし、日付+3を返す方法がわかりません。

そう:

CREATE TABLE calendar
(
    thedate DATETIME NOT NULL,
    isweekday SMALLINT NULL,
    isholiday SMALLINT NULL
);

と:

SELECT thedate AS fromdate, xxx AS todate
FROM calendar

私が望むのは、todate が fromdate + 72 時間であり、週末と休日を数えないことです。isweekday で isholiday ではない COUNT(*) を実行するのは簡単ですが、DATEADD() を実行するのは別の問題です。

どこから始めればよいかわかりません。

4

4 に答える 4

1

編集: 有効な fromDates として非稼働日を含めるように変更されました。

WITH rankedDates AS
    (
        SELECT 
            thedate
            , ROW_NUMBER()
                OVER(
                    ORDER BY thedate
                    ) dateRank
        FROM 
            calendar c
        WHERE 
            c.isweekday = 1 
            AND 
            c.isholiday = 0
    )
SELECT 
    c1.fromdate
    , rd2.thedate todate
FROM
    ( 
        SELECT 
            c.thedate fromDate
            , 
                (
                    SELECT 
                        TOP 1 daterank
                    FROM 
                        rankedDates rd
                    WHERE
                        rd.thedate <= c.thedate
                    ORDER BY 
                        thedate DESC
                ) dateRank
        FROM 
            calendar c
    ) c1        
LEFT JOIN
    rankedDates rd2
    ON 
        c1.dateRank + 3 = rd2.dateRank        

これを簡素化し、CTE を回避するために、カレンダー テーブルに日付ランク列を配置できます。

CREATE TABLE
    calendar
    (
        TheDate DATETIME PRIMARY KEY
        , isweekday BIT NOT NULL
        , isHoliday BIT NOT NULL DEFAULT 0
        , dateRank INT NOT NULL
    );

次に、休日以外の平日の場合にのみ daterank 列を設定します。

于 2013-05-28T19:11:48.667 に答える
0

私があなたの質問を理解していない限り、DATEADDだけが必要です。

DATEADD(DAY,3,fromdate)

編集: わかりました、土日祝日を除いて、一時的に更新されます。

更新: Jason が成功したように見えますが、SQL2012 を使用している可能性がある場合は、単純なバージョンを次に示します。

SELECT todate = thedate
       fromdate = LEAD(thedate,3) OVER (ORDER BY thedate)
FROM calendar
WHERE isweekday = 1
 AND isHoliday = 0
于 2013-05-28T19:09:36.200 に答える