在我的查询中修改什么来修复文字格式字符串错误?

时间:2015-05-14 06:48:37

标签: sql oracle datetime-format

Literal与格式字符串

不匹配
select TO_DATE(TO_CHAR(A.DATE,'DD/MM/YYYY') || TO_CHAR(A.TIME),'DD/MM/YYYY HH24:MI:SS') 
from dual , TAB A

如何修改我的查询以免产生上述错误?

A.TIME类型为varchar2(20),A.DATE为日期

我也有这个条件

Select TO_DATE(TO_CHAR(A.DATE,'DD/MM/YYYY') || TO_CHAR(A.TIME),'DD/MM/YYYY HH24:MI:SS')  < TO_DATE('20/04/2015','DD/MM/YYYY') +1
from dual , TAB A

它产生错误如何修改

2 个答案:

答案 0 :(得分:2)

  

A.TIME类型为varchar2(20),A.DATE为日期

您永远不应该单独存储日期和时间元素。 DATE 数据类型具有秒精度的日期和时间元素。

SQL> SELECT SYSDATE FROM DUAL;

SYSDATE
-------------------
14/05/2015 12:57:42

先修复你的设计。

作为一种可能的解决方法,您可以将日期文字附加到该时间,然后应用 TO_DATE 将其转换为日期。

例如,

SQL> ALTER SESSION SET NLS_DATE_FORMAT='DD/MM/YYYY HH24:MI:SS';

Session altered.

SQL> WITH DATA AS(
  2  SELECT SYSDATE dt, '13:05:10' tm FROM dual
  3  )
  4  SELECT TO_DATE(
  5     TO_CHAR(dt,'DD/MM/YYYY')
  6     || ' '||
  7     tm,
  8     'DD/MM/YYYY HH24:MI:SS') as "datetime"
  9  FROM data;

datetime
-------------------
14/05/2015 13:05:10

您修改过的查询如下所示:

SELECT TO_DATE(
   TO_CHAR(t.date,'DD/MM/YYYY')
   || ' '||
   t.time,
   'DD/MM/YYYY HH24:MI:SS', 'NLS_DATE_LANGUAGE=ENGLISH') AS "datetime"
FROM your_table t;

您可能遇到的问题是,如果TIME列不符合'HH24:MI:SS格式,那么您将无法使其正常工作。它完全取决于格式,因为您已将其存储为字符串。

答案 1 :(得分:1)

试试这个

select TO_DATE(TO_CHAR(A.DATE,'DD/MM/YYYY') || ' ' || A.TIME,'DD/MM/YYYY HH24:MI:SS') 
from dual , TAB A

仅当A.TIME列中的数据格式为HH24:MI:SS时,此方法才有效。 你应该使用case-when来处理选择列表中的布尔表达式。

     Select 
    case when TO_DATE(TO_CHAR(A.DATE,'DD/MM/YYYY') ||
         A.TIME,'DD/MM/YYYY HH24:MI:SS')  
            < (TO_DATE('20/04/2015','DD/MM/YYYY') +1) 
    then 'Y' else 'N' end
   from dual , TAB A