Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tham gia SQL với phạm vi ngày?

Trước tiên, bạn có thể tự tham gia tỷ giá hối đoái được sắp xếp theo ngày để bạn có ngày bắt đầu và ngày kết thúc của mỗi tỷ giá hối đoái mà không có bất kỳ sự trùng lặp hoặc chênh lệch nào về ngày tháng (có thể thêm nó làm chế độ xem vào cơ sở dữ liệu của bạn - trong trường hợp của tôi, tôi chỉ đang sử dụng một biểu thức bảng chung).

Giờ đây, việc tham gia các tỷ giá "chuẩn bị sẵn" đó với các giao dịch thật đơn giản và hiệu quả.

Một cái gì đó như:

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)

Ghi chú:

  • Bạn có thể thay thế GETDATE() với một ngày trong tương lai xa, ở đây tôi giả định rằng không có tỷ lệ nào cho tương lai được biết trước.

  • Quy tắc (B) được thực hiện bằng cách đặt ngày của tỷ giá hối đoái đã biết đầu tiên thành ngày tối thiểu được hỗ trợ bởi SQL Server datetime , nên (theo định nghĩa nếu đó là loại bạn đang sử dụng cho Date cột) là giá trị nhỏ nhất có thể.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nếu khóa ngoại không tồn tại thì thêm ràng buộc khóa ngoại (Hoặc bỏ ràng buộc khóa ngoại nếu tồn tại) mà không sử dụng Tên?

  2. Kết quả Truy vấn Email dưới dạng Bảng HTML trong SQL Server (T-SQL)

  3. Khôi phục cơ sở dữ liệu SQL Server - Khóa chính không mở

  4. SQL Server 2008 Chạy kích hoạt sau khi Chèn, Cập nhật khóa bảng gốc

  5. SQL Server và khoảng trống trong cột Identity