【问题标题】:ORACLE SQL SYSDATE and betweenORACLE SQL SYSDATE 和之间
【发布时间】:2022-01-16 16:44:48
【问题描述】:

我正在尝试使用SYSDATE 和SYSDATE - 300 之间的日期。

SELECT date_entered
  FROM customer_order_join
 WHERE TO_CHAR(date_entered, 'YYYYMMDD') BETWEEN
       TO_DATE(sysdate, 'YYYYMMDD') AND TO_DATE(sysdate, 'YYYYMMDD') - 300

我收到以下错误:

ORA-01858:在需要数字的地方发现了一个非数字字符。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您的 where 子句中有一些奇怪的日期转换:

    1. To_Char(DATE_ENTERED, 'YYYYMMDD') 如果该列已经是日期类型,只需使用该列而不进行任何转换,如果它是一个字符串,则使用 TO_DATE。

    2. TO_DATE(SYSDATE,'YYYYMMDD') 无需转换

    3. TO_DATE(SYSDATE,'YYYYMMDD')-300 无需转换

    所以也许只是:

    SELECT DATE_ENTERED FROM CUSTOMER_ORDER_JOIN
    WHERE TRUNC(DATE_ENTERED) Between TRUNC(SYSDATE - 300) AND TRUNC(SYSDATE); 
    

    【讨论】:

    • 由于SYSDATE 和SYSDATE - 300 在WHERE 子句中标识符的顺序,从不返回结果。
    【解决方案2】:

    SYSDATE 返回一个DATE 值。永远不要在已经是 DATE 的值上运行 TO_DATE()。除此之外,BETWEEN ... AND 需要较低的日期。

    你可以直接比较DATE的值,我猜你在找这个:

    SELECT DATE_ENTERED 
    FROM CUSTOMER_ORDER_JOIN
    WHERE DATE_ENTERED Between SYSDATE-300 AND SYSDATE
    

    您很可能只想比较日期值,而不比较时间值。然后你可以使用这个:

    SELECT DATE_ENTERED 
    FROM CUSTOMER_ORDER_JOIN
    WHERE TRUNC(DATE_ENTERED) Between TRUNC(SYSDATE-300) AND TRUNC(SYSDATE) -- or TRUNC(SYSDATE)+1 to cover full day
    

    请注意,查询不会使用DATE_ENTERED 上的索引,除非您在TRUNC(DATE_ENTERED) 上有基于函数的索引。所以你可能更喜欢

    SELECT DATE_ENTERED 
    FROM CUSTOMER_ORDER_JOIN
    WHERE DATE_ENTERED >= TRUNC(SYSDATE-300) 
       AND DATE_ENTERED < TRUNC(SYSDATE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      相关资源
      最近更新 更多