PLSQL“IN”运算符

PLSQL“IN”运算符,sql,oracle,plsql,Sql,Oracle,Plsql,我试图根据以下PLSQL查询确定的“日期”范围来选择行,该查询当前提供我需要的结果,即脚本运行时一周中最后10周的“日期”对象。在5月22日运行将产生5月15日、5月8日等 SELECT SYSDATE-(level*7) as DateRange FROM DUAL CONNECT BY LEVEL <=10 这将生成一个日期列表。然后,我尝试将其与父select语句结合起来,以获取上面输出的日期行,这些日期位于Oracle类型的日期列的“DAY”中 SELECT * FROM NEM

我试图根据以下PLSQL查询确定的“日期”范围来选择行,该查询当前提供我需要的结果,即脚本运行时一周中最后10周的“日期”对象。在5月22日运行将产生5月15日、5月8日等

SELECT SYSDATE-(level*7) as DateRange
FROM DUAL
CONNECT BY LEVEL <=10
这将生成一个日期列表。然后,我尝试将其与父select语句结合起来,以获取上面输出的日期行,这些日期位于Oracle类型的日期列的“DAY”中

SELECT * FROM NEM_RM16
WHERE NEM_RM16.DAY IN (
  SELECT SYSDATE-(level*7) as DateRange
  FROM DUAL
  CONNECT BY LEVEL <=10);
这不会给出任何结果,尽管知道有些行的日期是由上述方法生成的

我已经读到,当使用'IN'运算符时,值必须用单引号括起来,但我不确定如何使用上面的查询实现这一点

使用IN运算符是正确的方法,还是应该执行不同类型的嵌套查询?

使用trunc从sysdate截断时间组件


嵌套查询返回的日期格式可能与NEM_RM16.DAY列的日期格式不匹配 如果在使用相同的格式后对日期进行比较,它们可能会正确匹配

像这样


希望它有助于

sysdate返回日期和时间。是否确定只选择与当前时间相同的记录?您在NEM_RM16.DAY中存储了什么?只有日期没有时间?您的问题是关于SQL IN运算符的,与PL/SQL无关。日期类型没有格式。varchar2类型的日期必须有格式;强制日期比较的两侧格式相同。如果您需要datetime变量的时间部分,请从每一面移除to_date和format掩码,并将其转换为字符串。@Karl,我不同意-基本想法是错误的,您不只是为了比较而格式化日期,oracle可以比较日期。如果你想忽略时间,那么按照turbanoff的回答来计算日期,如果正如我在评论中所说的,你想包括时间,例如,如果你想在所讨论的日期的10:15之后?根据truncsystate列中的值,“J”似乎有点不合常规。我会选择truncSYSDATE或truncSYSDATE,我自己。truncSYSDATE,截短到本周开始
SELECT * FROM NEM_RM16
WHERE NEM_RM16.DAY IN (
  SELECT trunc(SYSDATE)-(level*7) as DateRange
  FROM DUAL
  CONNECT BY LEVEL <=10);

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);