日期字符串到日期的错误转换
Wrong conversion of date-string to date
当运行这些语句时:
select to_date('201103270100', 'YYYYMMDDHH24MI') from dual;
select to_date('201103270130', 'YYYYMMDDHH24MI') from dual;
我得到这些结果:
27/3/2011 1:00:00
27/3/2011 1:30:00
哪些是正确的。
但是当运行:
select to_date('201103270200', 'YYYYMMDDHH24MI') from dual
结果我弄错了时间
27/3/2011 3:00:00
更多样本:
select to_date('201103270215', 'YYYYMMDDHH24MI') from dual
select to_date('201103270245', 'YYYYMMDDHH24MI') from dual
select to_date('201103270300', 'YYYYMMDDHH24MI') from dual
select to_date('201103270330', 'YYYYMMDDHH24MI') from dual
27/3/2011 3:15:00
27/3/2011 3:45:00
27/3/2011 3:00:00
27/3/2011 3:30:00
当日期是 20110326 时,我得到了正确的结果。
这太疯狂了... Oracle SQL 是在用这个转换欺负我吗?
欢迎帮助!
Is Oracle SQL bullying me with this conversion?
Oracle 太笨了,不会欺负开发人员,除非开发人员试图欺负它;-)
不能无缘无故的输出不同。在欧洲,在 2011 年,夏令时 从 2011 年 3 月 27 日 2:00上午。 Source is wikipedia.
所以,记住夏令时,让我们看看 2:00 AM:
之后日期时间的结果
SQL> SELECT to_char(to_date('201103270100', 'YYYYMMDDHH24MI'), 'DD/MM/YYYY HH24:MI:SS') FROM dual;
TO_CHAR(TO_DATE('20
-------------------
27/03/2011 01:00:00
SQL> SELECT to_char(to_date('201103270130', 'YYYYMMDDHH24MI'), 'DD/MM/YYYY HH24:MI:SS') FROM dual;
TO_CHAR(TO_DATE('20
-------------------
27/03/2011 01:30:00
SQL> SELECT to_char(to_date('201103270200', 'YYYYMMDDHH24MI'), 'DD/MM/YYYY HH24:MI:SS') FROM dual;
TO_CHAR(TO_DATE('20
-------------------
27/03/2011 02:00:00
SQL> SELECT to_char(to_date('201103270215', 'YYYYMMDDHH24MI'), 'DD/MM/YYYY HH24:MI:SS') FROM dual;
TO_CHAR(TO_DATE('20
-------------------
27/03/2011 02:15:00
SQL> SELECT to_char(to_date('201103270245', 'YYYYMMDDHH24MI'), 'DD/MM/YYYY HH24:MI:SS') FROM dual;
TO_CHAR(TO_DATE('20
-------------------
27/03/2011 02:45:00
SQL> SELECT to_char(to_date('201103270300', 'YYYYMMDDHH24MI'), 'DD/MM/YYYY HH24:MI:SS') FROM dual;
TO_CHAR(TO_DATE('20
-------------------
27/03/2011 03:00:00
SQL> SELECT to_char(to_date('201103270330', 'YYYYMMDDHH24MI'), 'DD/MM/YYYY HH24:MI:SS') FROM dual;
TO_CHAR(TO_DATE('20
-------------------
27/03/2011 03:30:00
SQL>
如果您提供的数据和示例是正确的,那么这应该是原因。
因此,您应该看到时间部分恰好在 2:00 AM 转移到 3:00 AM。同样,2:15 AM 将是 3:15 AM。只需 为上午 2:00 之后的时间增加一个小时。
当运行这些语句时:
select to_date('201103270100', 'YYYYMMDDHH24MI') from dual;
select to_date('201103270130', 'YYYYMMDDHH24MI') from dual;
我得到这些结果:
27/3/2011 1:00:00
27/3/2011 1:30:00
哪些是正确的。
但是当运行:
select to_date('201103270200', 'YYYYMMDDHH24MI') from dual
结果我弄错了时间
27/3/2011 3:00:00
更多样本:
select to_date('201103270215', 'YYYYMMDDHH24MI') from dual
select to_date('201103270245', 'YYYYMMDDHH24MI') from dual
select to_date('201103270300', 'YYYYMMDDHH24MI') from dual
select to_date('201103270330', 'YYYYMMDDHH24MI') from dual
27/3/2011 3:15:00
27/3/2011 3:45:00
27/3/2011 3:00:00
27/3/2011 3:30:00
当日期是 20110326 时,我得到了正确的结果。
这太疯狂了... Oracle SQL 是在用这个转换欺负我吗? 欢迎帮助!
Is Oracle SQL bullying me with this conversion?
Oracle 太笨了,不会欺负开发人员,除非开发人员试图欺负它;-)
不能无缘无故的输出不同。在欧洲,在 2011 年,夏令时 从 2011 年 3 月 27 日 2:00上午。 Source is wikipedia.
所以,记住夏令时,让我们看看 2:00 AM:
之后日期时间的结果SQL> SELECT to_char(to_date('201103270100', 'YYYYMMDDHH24MI'), 'DD/MM/YYYY HH24:MI:SS') FROM dual;
TO_CHAR(TO_DATE('20
-------------------
27/03/2011 01:00:00
SQL> SELECT to_char(to_date('201103270130', 'YYYYMMDDHH24MI'), 'DD/MM/YYYY HH24:MI:SS') FROM dual;
TO_CHAR(TO_DATE('20
-------------------
27/03/2011 01:30:00
SQL> SELECT to_char(to_date('201103270200', 'YYYYMMDDHH24MI'), 'DD/MM/YYYY HH24:MI:SS') FROM dual;
TO_CHAR(TO_DATE('20
-------------------
27/03/2011 02:00:00
SQL> SELECT to_char(to_date('201103270215', 'YYYYMMDDHH24MI'), 'DD/MM/YYYY HH24:MI:SS') FROM dual;
TO_CHAR(TO_DATE('20
-------------------
27/03/2011 02:15:00
SQL> SELECT to_char(to_date('201103270245', 'YYYYMMDDHH24MI'), 'DD/MM/YYYY HH24:MI:SS') FROM dual;
TO_CHAR(TO_DATE('20
-------------------
27/03/2011 02:45:00
SQL> SELECT to_char(to_date('201103270300', 'YYYYMMDDHH24MI'), 'DD/MM/YYYY HH24:MI:SS') FROM dual;
TO_CHAR(TO_DATE('20
-------------------
27/03/2011 03:00:00
SQL> SELECT to_char(to_date('201103270330', 'YYYYMMDDHH24MI'), 'DD/MM/YYYY HH24:MI:SS') FROM dual;
TO_CHAR(TO_DATE('20
-------------------
27/03/2011 03:30:00
SQL>
如果您提供的数据和示例是正确的,那么这应该是原因。
因此,您应该看到时间部分恰好在 2:00 AM 转移到 3:00 AM。同样,2:15 AM 将是 3:15 AM。只需 为上午 2:00 之后的时间增加一个小时。