Oracle SQL尝试比较不同的日期

时间:2018-02-12 00:24:53

标签: sql oracle

我有两个不同格式的订单日期,我正在尝试比较,而且我收到了“无效日期”错误。日期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

2 个答案:

答案 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>