sql >> Database teknologi >  >> RDS >> Sqlserver

SQL join mod datointervaller?

Du kan først lave en selvtilslutning på de valutakurser, der er sorteret efter dato, så du har start- og slutdatoen for hver valutakurs, uden nogen overlapning eller hul i datoerne (måske tilføje det som visning til din database - i mit tilfælde bruger jeg bare et almindeligt tabeludtryk).

Nu er det enkelt og effektivt at slutte sig til de "forberedte" priser med transaktionerne.

Noget som:

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)

Bemærkninger:

  • Du kan erstatte GETDATE() med en dato i den fjerne fremtid, antager jeg her, at der ikke kendes nogen kurser for fremtiden.

  • Regel (B) implementeres ved at sætte datoen for den første kendte valutakurs til den minimale dato, der understøttes af SQL Server datetime , som skal (per definition, hvis det er den type, du bruger til Date kolonne) være den mindst mulige værdi.



  1. MySQL:Vælg unik værdi i kolonne baseret på en anden kolonneværdi

  2. Fejl med en Symfony-forespørgsel:Forventet bogstavelig, fik ''

  3. SQL Server 2005 - Order of Indre Joins

  4. mysql PDO og lagret procedure dynamisk SQL-injektion