带有两个日期过滤器的Oracle SQL查询不会返回值

时间:2016-10-24 17:59:26

标签: sql oracle

我在oracle中有这个表:

CREATE TABLE "MY_FOO"."SG_MEM" 
   (    "SG_MEM_OBJ" NUMBER, 
    "SG_OBJ_NUM" NUMBER, 
    "SUB_NUM" NUMBER, 
    "F_DATE" DATE, 
    "X_DATE" DATE
   }

然后我插入初始数据:

insert into SG_MEM  (  SG_MEM_OBJ ,
                        SG_OBJ_NUM , 
                        SUB_NUM ,
                        F_DATE , 
                        X_DATE  ) 
            values  (
                        24242,
                        33333,
                        2001936,
                        SYSDATE,
                        TO_DATE('2019/10/19 10:43:12', 'yyyy/mm/dd HH:MI:SS'));

表中现在的值如下所示:

INSERT
INTO EXPORT_TABLE
  (
    SG_MEM_OBJ ,
    SG_OBJ_NUM,
    SUB_NUM ,
    F_DATE ,
    X_DATE
  )
  VALUES
  (
    24242,33333,2001936,
    to_date('20-October-2016','DD-MON-RRRR'),
    to_date('19-October-2019','DD-MON-RRRR')
  ); 

现在我的问题是我尝试获取这样的数据:

select SG_MEM_OBJ ,
                  SG_OBJ_NUM ,
                  SUB_NUM ,
                  F_DATE ,
                  X_DATE  
 from SG_MEM  
 where  SG_MEM_OBJ =2001936 
and F_DATE  <=  TO_DATE('16/10/24 8:10:12', 'yyyy/mm/dd HH:MI:SS')
and X_DATE  > TO_DATE('16/10/24 8:10:12', 'yyyy/mm/dd HH:MI:SS');    

如果我评论此行,它不会获取唯一的单个记录:

 and F_DATE  <=  TO_DATE('16/10/24 8:10:12', 'yyyy/mm/dd HH:MI:SS')     

确实取得了它 我在这里看不到问题。

1 个答案:

答案 0 :(得分:1)

即使日期明显一致,您将字符串转换为日期的方式 - 特别是在最终查询中 - 是不对的。例如,当你这样做:

and F_DATE  <=  TO_DATE('16/10/24 8:10:12', 'yyyy/mm/dd HH:MI:SS')

您没有得到您期望的日期。你在格式模型中传递了一个两位数的年份,带有一个4位数的年份掩码;你可以看到实际产生的东西:

alter session set nls_date_format = 'SYYYY-MM-DD HH24:MI:SS';
select TO_DATE('16/10/24 8:10:12', 'yyyy/mm/dd HH:MI:SS') from dual;

TO_DATE('16/10/248:1
--------------------
 0016-10-24 08:10:12

所以你在0016之前,而不是在2016年之前寻找价值。你应该这样做:

and F_DATE  <=  TO_DATE('2016/10/24 8:10:12', 'yyyy/mm/dd HH24:MI:SS')

您应该使用HH24代替HH,所以我已经使用过了。您的所有时间目前都是AM,这可能是您想要的,但最好是明确的。

如果要搜索的值是固定的,则可以使用ANSI时间戳文字(如果列已编入索引,则转换为日期)。如果您使用年份的RR模型而不是YYYYYY 还可以在字符串中使用两位数的年份;但最好还是使用四位数年来避免混淆。