sql >> Databasteknik >  >> RDS >> Sqlserver

SQL join mot datumintervall?

Du kan först göra en självanslutning på växelkurserna som är ordnade efter datum så att du har start- och slutdatum för varje växelkurs, utan någon överlappning eller lucka i datumen (kanske lägg till det som vy till din databas - i mitt fall använder jag bara ett vanligt tabelluttryck).

Nu är det enkelt och effektivt att förena dessa "förberedda" priser med transaktionerna.

Något i stil med:

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)

Anmärkningar:

  • Du kan ersätta GETDATE() med ett datum i en lång framtid, antar jag här att inga priser för framtiden är kända.

  • Regel (B) implementeras genom att ställa in datumet för den första kända växelkursen till det minimala datumet som stöds av SQL Server datetime , vilket bör (per definition om det är den typ du använder för Date kolumn) vara det minsta möjliga värdet.



  1. Hur lägger man till 1 timme till currrent_timestamp i mysql som är standardvärdet?

  2. Hur skriver man en raderingsregel på en vy?

  3. Oracle-klient ORA-12541:TNS:ingen lyssnare

  4. MySQL:Enkelt sätt att växla ett värde för ett int-fält