簡體   English   中英

Oracle / SQL查找日期或最接近指定日期的日期

[英]Oracle/SQL Find Date or Closest date to specified date

我正在嘗試在創建值的oracle中運行查詢。 基礎表並不總是包含特定日期的匹配項。 因此,我必須找到具有指定日期的記錄,或者找到指定日期以下的最接近日期。

SUM(CASE 
            WHEN S.VAL_SECURITY NOT IN ('GBP')
                AND E.SECURITY_ID NOT IN ('GBP')
                THEN (
                        (((amount) * - 1) / nvl(s.minor_per_unit, 1)) * (
                            SELECT EXCHANGE_RATE
                            FROM ISET.PREVIOUS_PRICES
                            WHERE ISET.PREVIOUS_PRICES.SECURITY_ID = E.SECURITY_ID
                                AND VAL_DATE = TO_DATE('05/08/2019', 'DD/MM/YYYY')
                            )
                        ) * (
                        SELECT EXCHANGE_RATE
                        FROM ISET.PREVIOUS_PRICES
                        WHERE SECURITY_ID = S.VAL_SECURITY
                            AND VAL_DATE = TO_DATE('05/08/2019', 'DD/MM/YYYY')
                        )
            WHEN S.VAL_SECURITY IN ('GBP')
                AND E.SECURITY_ID NOT IN ('GBP')
                THEN (
                        (((amount) * - 1) / nvl(s.minor_per_unit, 1)) * (
                            SELECT EXCHANGE_RATE
                            FROM ISET.PREVIOUS_PRICES
                            WHERE ISET.PREVIOUS_PRICES.SECURITY_ID = E.SECURITY_ID
                                AND VAL_DATE = TO_DATE('05/08/2019', 'DD/MM/YYYY')
                            )
                        )
            ELSE ((amount) * - 1) / nvl(s.minor_per_unit, 1)
END) GBP_VALUE

有問題的代碼是

E.SECURITY_ID AND VAL_DATE = TO_DATE('05/08/2019', 'DD/MM/YYYY')

因此,假設它找不到指定日期的記錄,則需要找到最接近但低於指定日期的最大日期記錄。

任何幫助將不勝感激。

謝謝

我認為您正在此選擇中尋找前1名:

SELECT EXCHANGE_RATE 
FROM ISET.PREVIOUS_PRICES 
WHERE ROWNUM = 1 
AND ISET.PREVIOUS_PRICES.SECURITY_ID=E.SECURITY_ID 
AND VAL_DATE <= TO_DATE('05/08/2019', 'DD/MM/YYYY') 
ORDER BY VAL_DATE DESC

嘗試編輯此內容,在where條件下使用ROWNUM = 1

你可以試試這個嗎? 我還沒有驗證。

    val_date =
(SELECT val_date
   FROM (SELECT MAX (b.val_date) val_date,
                MIN (TO_DATE ('05/08/2019', 'DD/MM/YYYY') - b.val_date)
                   diff
           FROM PREVIOUS_PRICES b
          WHERE     SECURITY_ID = E.SECURITY_ID
                AND status_date <= TO_DATE ('05/08/2019', 'DD/MM/YYYY')
         UNION ALL
         SELECT MIN (val_date),
                MIN (b.val_date - TO_DATE ('05/08/2019', 'DD/MM/YYYY'))
           FROM PREVIOUS_PRICES b
          WHERE     SECURITY_ID = E.SECURITY_ID
                AND status_date > TO_DATE ('05/08/2019', 'DD/MM/YYYY')
         ORDER BY 2)
  WHERE ROWNUM = 1)

再使用一個嵌入式SQL級別

SELECT EXCHANGE_RATE
  FROM ISET.PREVIOUS_PRICES
 WHERE ISET.PREVIOUS_PRICES.SECURITY_ID = E.SECURITY_ID
       AND VAL_DATE = (
       SELECT MAX(val_date)
         FROM iset.previous_prices
        WHERE val_date <= TO_DATE ( '05/08/2019', 'DD/MM/YYYY' ) 
         and PREVIOUS_PRICES.SECURITY_ID = E.SECURITY_ID);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM