SQL Sysdate范围

时间:2018-10-15 14:17:06

标签: sql oracle

我正在尝试使用以下查询查找从当前日期起1至4天范围内已关闭并且运气不佳的工作单。

SELECT B.ITEMNO,
       B.DESCRIP2
FROM   HIST_ILLUM_RT A,
       HIST_ILLUM_PART B
WHERE  A.TEAR_DOWN_TIME <= SYSDATE -1  AND A.TEAR_DOWN_TIME >= SYSDATE -4

该查询似乎正在关闭所有工作单。 TEAR_DOWN_TIME字段的格式为MM / DD / YYYY HH / MM / SS

感谢您的帮助。预先感谢!

3 个答案:

答案 0 :(得分:1)

范围通常具有“大于x且小于y”的形式

您使用了“少于”两次

你是说

A.TEAR_DOWN_TIME >= SYSDATE -4

其他注意事项:

  • 在80年代样式表(表所在位置)上首选ANSI连接语法(内部/左侧/右侧/完全)
  • 具有正确日期时间或类似类型的列中的日期/时间数据没有格式,看起来像时间的字符串具有格式。数据库可能具有将日期/时间类型的数据转换为字符串时使用的默认格式,但与数据的存储方式无关。始终将您的时间数据存储为日期时间类型,因为将其存储为字符串可能会导致性能下降和无法预测的比较

答案 1 :(得分:0)

您需要将列转换为日期:

WHERE TO_DATE(A.TEAR_DOWN_TIME, 'MM/DD/YYYY HH24/MI/SS') <= SYSDATE - 1  AND
      TO_DATE(A.TEAR_DOWN_TIME, 'MM/DD/YYYY HH24/MI/SS') >= SYSDATE - 4

您的逻辑正在进行字符串比较。道德?使用正确的数据类型存储数据。

答案 2 :(得分:0)

通过使用ANSI连接(如Caius Jard所述),并假设表的主键都是ID,请尝试以下代码:

SELECT B.ITEMNO, B.DESCRIP2
FROM HIST_ILLUM_RT A
  JOIN HIST_ILLUM_PART B ON A.ID=B.ID
WHERE A.TEAR_DOWN_TIME <= SYSDATE-1 AND A.TEAR_DOWN_TIME >= SYSDATE-4;

请注意:我将亲自重写 where 子句,使TEAR_DOWN_TIME位于边界日期之间,以便于阅读,例如:

WHERE SYSDATE-4 <= A.TEAR_DOWN_TIME and A.TEAR_DOWN_TIME <= SYSDATE-1