Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL bergabung dengan rentang tanggal?

Anda dapat terlebih dahulu melakukan self-join pada nilai tukar yang diurutkan berdasarkan tanggal sehingga Anda memiliki tanggal mulai dan tanggal akhir dari setiap nilai tukar, tanpa tumpang tindih atau celah pada tanggal (mungkin tambahkan itu sebagai tampilan ke database Anda - dalam kasus saya, saya hanya menggunakan ekspresi tabel umum).

Sekarang bergabung dengan tarif "yang disiapkan" itu dengan transaksi yang sederhana dan efisien.

Sesuatu seperti:

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)

Catatan:

  • Anda dapat mengganti GETDATE() dengan tanggal di masa depan yang jauh, saya berasumsi di sini bahwa tidak ada tarif untuk masa depan yang diketahui.

  • Aturan (B) diterapkan dengan menetapkan tanggal nilai tukar pertama yang diketahui ke tanggal minimal yang didukung oleh datetime SQL Server , yang seharusnya (menurut definisi jika itu adalah jenis yang Anda gunakan untuk Date kolom) menjadi nilai sekecil mungkin.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pialang Layanan Server Sql

  2. Menangkap hitungan dari kueri SQL

  3. Cara Memasang SSMS

  4. Menghapus Profil Email Database (SSMS)

  5. Bagaimana saya bisa mencegah pertumbuhan log di SQL Server saat memasukkan jutaan catatan