sql >> データベース >  >> RDS >> Sqlserver

SQLServerで2つの日付の間のすべての日付を取得する

    私の最初の提案は、カレンダーテーブルを使用することです。カレンダーテーブルがない場合は、作成します。それらは非常に便利です。クエリは次のように簡単です。

    DECLARE @MinDate DATE = '20140101',
            @MaxDate DATE = '20140106';
    
    SELECT  Date
    FROM    dbo.Calendar
    WHERE   Date >= @MinDate
    AND     Date < @MaxDate;
    

    カレンダーテーブルを作成したくない場合、または作成できない場合でも、再帰CTEなしでオンザフライでこれを行うことができます:

    DECLARE @MinDate DATE = '20140101',
            @MaxDate DATE = '20140106';
    
    SELECT  TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
            Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)
    FROM    sys.all_objects a
            CROSS JOIN sys.all_objects b;
    

    詳細については、以下を参照してください:

    • ループのないセットまたはシーケンスを生成する–パート1
    • ループのないセットまたはシーケンスを生成する–パート2
    • ループのないセットまたはシーケンスを生成する–パート3

    この一連の日付をカーソルで使用することに関しては、別の方法を見つけることを強くお勧めします。通常、はるかに優れたパフォーマンスを発揮するセットベースの代替手段があります。

    だからあなたのデータで:

      date   | it_cd | qty 
    24-04-14 |  i-1  | 10 
    26-04-14 |  i-1  | 20
    

    2014年4月28日の数量を取得するには(私が収集したものが要件です)、実際には上記のいずれも必要ありません。次を使用するだけです。

    SELECT  TOP 1 date, it_cd, qty 
    FROM    T
    WHERE   it_cd = 'i-1'
    AND     Date <= '20140428'
    ORDER BY Date DESC;
    

    特定のアイテムに使用したくない場合:

    SELECT  date, it_cd, qty 
    FROM    (   SELECT  date, 
                        it_cd, 
                        qty, 
                        RowNumber = ROW_NUMBER() OVER(PARTITION BY ic_id 
                                                        ORDER BY date DESC)
                FROM    T
                WHERE   Date  <= '20140428'
            ) T
    WHERE   RowNumber = 1;
    


    1. oraclesqldeveloperを使用して1つのデータベースから別のデータベースにコピーします-接続に失敗しました

    2. MySQL条件付き挿入

    3. Word、Excel、PowerPointでクイックアクセスツールバーを表示または再表示する方法

    4. MariaDBでのHEX()のしくみ