【问题标题】:PLSQL 'IN' OperatorPLSQL 'IN' 运算符
【发布时间】:2012-05-24 19:02:16
【问题描述】:

我正在尝试根据以下 PLSQL 查询确定的“日期”范围选择行,该查询当前提供了我需要的结果 - 作为一周中最后 10 周的“日期”对象脚本运行时。例如。在 5 月 22 日运行它会产生 5 月 15 日、5 月 8 日等等。

SELECT SYSDATE-(level*7) as DateRange
FROM DUAL
CONNECT BY LEVEL <=10

这会生成日期列表。然后我尝试将它与父 select 语句结合起来,以获取上面输出的日期在“DAY”(Oracle 类型 DATE)列中的行。

SELECT * FROM NEM_RM16
WHERE NEM_RM16.DAY IN (
  SELECT SYSDATE-(level*7) as DateRange
  FROM DUAL
  CONNECT BY LEVEL <=10);

尽管知道有行具有上述生成的日期,但它没有给出任何结果。

我读过,在使用“IN”运算符时,值必须用单引号括起来,但我不确定如何使用上面的查询来做到这一点。

我是通过使用 IN 运算符以正确的方式解决这个问题,还是应该执行不同类型的嵌套查询?

【问题讨论】:

  • sysdate 返回日期和时间。您确定只选择与当前时间相同的那些记录吗?您在 NEM_RM16.DAY 中存储了什么?只有日期没有时间?
  • 您的问题是关于SQL IN 运算符,与PL/SQL 无关。

标签: sql oracle plsql


【解决方案1】:

使用trunc 截断来自sysdate 的时间组件

SELECT * FROM NEM_RM16
WHERE NEM_RM16.DAY IN (
  SELECT trunc(SYSDATE)-(level*7) as DateRange
  FROM DUAL
  CONNECT BY LEVEL <=10);

【讨论】:

  • a trunc(NEM_RM16.DAY) 也可能是必要的,具体取决于该列中的值
  • trunc(SYSDATE,'J') 似乎有点不合常规。我自己会选择 trunc(SYSDATE) 或 trunc(SYSDATE,'D')。
  • trunc(SYSDATE,'D') 截断到一周的开始
【解决方案2】:

可能嵌套查询返回的日期格式与NEM_RM16.DAY列的日期格式不匹配 可能,如果将日期设置为相同格式后进行比较,它们将正确匹配

像这样


SELECT *
  FROM NEM_RM16
 WHERE TO_DATE(TO_CHAR(NEM_RM16.DAY, 'DD/MM/YYYY'), 'DD/MM/YYYY') IN
       (SELECT TO_DATE(TO_CHAR(SYSDATE - (level * 7), 'DD/MM/YYYY'),
                       'DD/MM/YYYY') as DateRange
          FROM DUAL
        CONNECT BY LEVEL <= 10);

希望对你有帮助

【讨论】:

  • 日期(日期类型)没有格式。 varchar2 类型的日期必须有格式。
  • 这里的基本思想是正确的;强制日期比较双方的格式相同。如果您需要 datetime 变量的时间部分,请从每一侧删除 to_date 和格式掩码,并将每个转换为字符串。
  • @Karl,我不同意 - 基本想法是错误的,您不只是为了比较而格式化日期,oracle 可以比较日期。如果您想忽略时间,请按照 turbanoff 的回答截断日期
  • 如果,正如我在评论中所说,你想包括时间,例如如果您想在相关日期的 10:15 之后?
猜你喜欢
  • 2019-07-16
  • 1970-01-01
  • 2011-11-15
  • 2012-05-10
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多