简体   繁体   English

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

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

I am trying to run a query within oracle which creates a value. 我正在尝试在创建值的oracle中运行查询。 The underlying table does not always contain a match for a specific date. 基础表并不总是包含特定日期的匹配项。 So i have to either find the record with the date specified or find the closest date below the specified date. 因此,我必须找到具有指定日期的记录,或者找到指定日期以下的最接近日期。

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

The code in question is 有问题的代码是

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

So assuming it doesn't find a record for the specified date then it needs to find the max date record closest to but below the specified date. 因此,假设它找不到指定日期的记录,则需要找到最接近但低于指定日期的最大日期记录。

Any help would be greatly appreciated. 任何帮助将不胜感激。

Thank you 谢谢

I think you are looking for top 1 in this select : 我认为您正在此选择中寻找前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

Try this edited , with ROWNUM = 1 in the where condition 尝试编辑此内容,在where条件下使用ROWNUM = 1

Could you try this? 你可以试试这个吗? I haven't verified it. 我还没有验证。

    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)

Use one more embedded SQL Level 再使用一个嵌入式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