最近在工作中发现一个奇怪的现象:执行以下SQLselect to_date(to_char(CSNY,'yyyy-mm-dd'),'yyyy-mm-dd'),to_char(CSNY,'yyyy-mm-dd'),to_date(CSNY),CSNY from GRXX where GRBH = '9000009500';结果:
1935-07-26 1935-07-26 2035-07-26 1935-07-26
其中:to_date(CSNY),1935年的数据变成了2035小弟不才,那位大侠能够指点一下?谢谢!
1935-07-26 1935-07-26 2035-07-26 1935-07-26
其中:to_date(CSNY),1935年的数据变成了2035小弟不才,那位大侠能够指点一下?谢谢!
-------------------
2001-03-27 00:00:00eygle@SZTYORA> select to_date('11-03-27','yy-mm-dd') from dual;TO_DATE('11-03-27',
-------------------
2011-03-27 00:00:00eygle@SZTYORA> select to_date('21-03-27','yy-mm-dd') from dual;TO_DATE('21-03-27',
-------------------
2021-03-27 00:00:00eygle@SZTYORA> select to_date('31-03-27','yy-mm-dd') from dual;TO_DATE('31-03-27',
-------------------
2031-03-27 00:00:00eygle@SZTYORA> select to_date('41-03-27','yy-mm-dd') from dual;TO_DATE('41-03-27',
-------------------
2041-03-27 00:00:00eygle@SZTYORA> select to_date('51-03-27','yy-mm-dd') from dual;TO_DATE('51-03-27',
-------------------
2051-03-27 00:00:00eygle@SZTYORA> select to_date('61-03-27','yy-mm-dd') from dual;TO_DATE('61-03-27',
-------------------
2061-03-27 00:00:00eygle@SZTYORA> select to_date('71-03-27','yy-mm-dd') from dual;TO_DATE('71-03-27',
-------------------
2071-03-27 00:00:00eygle@SZTYORA> select to_date('81-03-27','yy-mm-dd') from dual;TO_DATE('81-03-27',
-------------------
2081-03-27 00:00:00eygle@SZTYORA> select to_date('91-03-27','yy-mm-dd') from dual;TO_DATE('91-03-27',
-------------------
2091-03-27 00:00:00eygle@SZTYORA> select to_date('99-03-27','yy-mm-dd') from dual;TO_DATE('99-03-27',
-------------------
2099-03-27 00:00:00
to_date(CSNY),
to_date(to_char(trunc(CSNY),'yyyy-mm-dd'),'yyyy-mm-dd'),
CSNY
from GRXX执行的结果如下,有三种不同的数据:1971-01-15 1971-01-15 1971-01-15 1971-01-15
1935-07-26 2035-07-26 1935-07-26 1935-07-26
0000-00-00 1964-05-07 1964-05-07 1964-05-07
to_char(CSNY),
to_date(CSNY),
to_date(to_char(trunc(CSNY),'yyyy-mm-dd'),'yyyy-mm-dd'),
CSNY
from GRXX
你再加上to_char(CSNY)或许能看出点问题。就是说to_date(CSNY)的话里面的参数要先执行to_char(CSNY)转为字符串。
to_char(CSNY),
to_date(CSNY),
to_date(to_char(trunc(CSNY),'yyyy-mm-dd'),'yyyy-mm-dd'),
CSNY
from GRXX执行结果是:1971-01-15 15-1月 -71 1971-01-15 1971-01-15 1971-01-15
1935-07-26 26-7月 -35 2035-07-26 1935-07-26 1935-07-26
0000-00-00 00-0000-00 1964-05-07 1964-05-07 1964-05-07请帮忙看看,谢谢!
CSNY字段的原类型是什么?-- 要查到底为什么:要从上面两个问题着手!
1971-01-15
1935-07-26
1964-05-07看不出来有什么差别啊?
2 to_char(CSNY),
3 to_date(CSNY),
4 to_date(to_char(trunc(CSNY),'yyyy-mm-dd'),'yyyy-mm-dd'),
5 CSNY
6 from GRXX;TO_CHAR(CSNY,'YYYY-M TO_CHAR(CSNY) TO_DATE(CSNY) TO_DATE(TO_CHAR(TRU CSNY
-------------------- -------------------------------------- ------------------- ------------------- -------------------
1971-01-15 1971-01-15 00:00:00 1971-01-15 00:00:00 1971-01-15 00:00:00 1971-01-15 00:00:00
1935-07-26 1935-07-26 00:00:00 1935-07-26 00:00:00 1935-07-26 00:00:00 1935-07-26 00:00:00
1964-05-07 1964-05-07 00:00:00 1964-05-07 00:00:00 1964-05-07 00:00:00 1964-05-07 00:00:00
楼主你主要的错误在于对一个已经是Date型的字段做TO_DATE处理。
你自己试一下这个。
select to_date(to_date('1935-07-26','YYYY-MM-DD')) from dual;
结果跟你描述的一样,但是谁也没有说过这样用是正确的。
参考:
ALTER session SET NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss';
select to_char(CSNY, 'yyyy-mm-dd'),
to_char(CSNY),
to_date(CSNY),
to_date(to_char(trunc(CSNY),'yyyy-mm-dd'),'yyyy-mm-dd'),
CSNY
from GRXX
这样再查就不会有错了。