ORACLE SQL SYSDATE and between



我正在尝试使用SYSDATESYSDATE - 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:在需要数字的位置找到了一个非数字字符

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)

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

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

  2. 截止日期(系统日期,'YYYYMMDD'(无需转换

  3. 截止日期(SYSDATE,'YYYYMMDD'(-300无需转换

所以可能只是:

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

最新更新