我在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')
确实取得了它 我在这里看不到问题。
答案 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
模型而不是YYYY
或YY
, 还可以在字符串中使用两位数的年份;但最好还是使用四位数年来避免混淆。