我有两个不同格式的订单日期,我正在尝试比较,而且我收到了“无效日期”错误。日期1. Date_of_ORDER是Varchar,格式为20180119.日期2. ORDER_DT为日期,格式为2018/01/19 00:00:00。我运行以下代码并得到“无效日期”错误...
SELECT T2.ORDER_ID, T2.ORDER_DT, T1.PRODUCTNAME, T1.DATE_OF_ORDER, T2.ORDER_DT
FROM FIRSTTABLE T1 INNER JOIN
SECONDTABLE T2
ON T1.ORDERID = T2.ORDER_ID AND TO_DATE(DATE_OF_ORDER, 'YYYY/MM/DD') = ORDER_DT
ORDER BY T2.ORDER_ID
答案 0 :(得分:1)
如果格式为YYYYMMDD,为什么使用斜杠?
试试这个:
TO_DATE(DATE_OF_ORDER, 'YYYYMMDD')
如果您的格式符合您的要求,那么这应该可行。
注意:您应该修复数据。如果使用正确的date
数据类型存储日期,那么您只是浪费了大量时间来尝试修复一个从未存在过的问题。就是这么简单 - 浪费时间或完成工作。
答案 1 :(得分:0)
理想情况下,所有日期都应放在适当的数据类型中。有时你不会选择第三方应用程序等。无论如何,如果你因为存储为字符串的日期而被困,那么
1)确保使用正确的格式掩码来获取数据
SQL> create table t ( id int, d varchar2(20));
Table created.
SQL>
SQL> insert into t values (1,'1999/01/01');
1 row created.
SQL> insert into t values (2,'2005/04/08');
1 row created.
SQL> insert into t values (3,'2012/09/21');
1 row created.
SQL> insert into t values (4,'2018/11/19');
1 row created.
SQL> select id, to_date(d,'YYYYMMDD') from t;
select id, to_date(d,'YYYYMMDD') from t
*
ERROR at line 1:
ORA-01858: a non-numeric character was found where a numeric was expected
SQL>
SQL> select id, to_date(d,'YYYY/MM/DD') from t;
ID TO_DATE(D
---------- ---------
1 01-JAN-99
2 08-APR-05
3 21-SEP-12
4 19-NOV-18
4 rows selected.
2)即使你有正确的格式掩码,因为字符串可以容纳任何东西,你可能会冒错误,例如
SQL>
SQL> insert into t values (5,'2019/02/12');
1 row created.
SQL> insert into t values (6,'20XX/11/19'); <=== problem
1 row created.
SQL> insert into t values (7,'2012/07/12');
1 row created.
SQL>
SQL> select id, to_date(d,'YYYY/MM/DD') from t;
ERROR:
ORA-01861: literal does not match format string
no rows selected
如果您使用的是最新版本的Oracle,则可以使用扩展语法返回默认值,或使用VALIDATE_CONVERSION来排除无效日期
SQL>
SQL> select id, to_date(d default null on conversion error,'YYYY/MM/DD' ) from t;
ID TO_DATE(D
---------- ---------
1 01-JAN-99
2 08-APR-05
3 21-SEP-12
4 19-NOV-18
5 12-FEB-19
6
7 12-JUL-12
7 rows selected.
SQL>
SQL> select id, d
2 from t
3 where validate_conversion(d as date,'YYYY/MM/DD') = 1;
ID D
---------- --------------------
1 1999/01/01
2 2005/04/08
3 2012/09/21
4 2018/11/19
5 2019/02/12
7 2012/07/12
6 rows selected.
SQL>