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

日付範囲に対するSQL結合?

    最初に、日付順に並べられた為替レートで自己結合を実行して、日付の重複やギャップなしに、各為替レートの開始日と終了日を取得できます(データベースにビューとして追加することもできます-私の場合、一般的なテーブル式を使用しています。

    これらの「準備された」レートをトランザクションに結合するのは簡単で効率的です。

    次のようなもの:

    WITH IndexedExchangeRates AS (           
                SELECT  Row_Number() OVER (ORDER BY Date) ix,
                        Date,
                        Rate 
                FROM    ExchangeRates 
            ),
            RangedExchangeRates AS (             
                SELECT  CASE WHEN IER.ix=1 THEN CAST('1753-01-01' AS datetime) 
                        ELSE IER.Date 
                        END DateFrom,
                        COALESCE(IER2.Date, GETDATE()) DateTo,
                        IER.Rate 
                FROM    IndexedExchangeRates IER 
                LEFT JOIN IndexedExchangeRates IER2 
                ON IER.ix = IER2.ix-1 
            )
    SELECT  T.Date,
            T.Amount,
            RER.Rate,
            T.Amount/RER.Rate ConvertedAmount 
    FROM    Transactions T 
    LEFT JOIN RangedExchangeRates RER 
    ON (T.Date > RER.DateFrom) AND (T.Date <= RER.DateTo)
    

    注:

    • GETDATE()を置き換えることができます 遠い将来の日付で、私はここで将来の料金が知られていないと仮定しています。

    • ルール(B)は、最初の既知の為替レートの日付をSQLServerのdatetimeでサポートされている最小の日付に設定することで実装されます。 、これは(定義上、Dateに使用しているタイプの場合) 列)可能な限り最小の値にします。



    1. 行を繰り返し列ベースのデータに変換するにはどうすればよいですか?

    2. 以前のクエリログの表示-MySQL

    3. 情報を動的にTwitterBootstrapモーダルにロードします

    4. Oracleでvarchar2の番号を渡すことはできますか?