ORA-01858错误消息

时间:2015-02-06 05:49:30

标签: sql oracle date format

我对日期格式错误有疑问。所以我有这个查询

SELECT TO_DATE (PS.PROJECT_START_DT, 'MM/DD/YYYY')

并给我 ORA-01858:找到了一个非数字字符,其中包含数字

我的表结构是这个

PROJECT_START_DT PROJECT_END_DT JOB_NAME
2/5/2015         4/2/2015       W-IGG
2/18/2015        3/19/2015      W14056
2/5/2015         3/31/2015      W14013

请帮我解决日期格式问题

1 个答案:

答案 0 :(得分:2)

  

SELECT TO_DATE(PS.PROJECT_START_DT,'MM / DD / YYYY')

在DATE列上使用 TO_DATE 是没有意义的。您需要 TO_CHAR 才能使用正确的 FORMAT MODEL 以所需的格式显示。

SQL> SELECT to_date(SYSDATE, 'mm/dd/yyyy') FROM dual;
SELECT to_date(SYSDATE, 'mm/dd/yyyy') FROM dual
               *
ERROR at line 1:
ORA-01858: a non-numeric character was found where a numeric was expected


SQL>
SQL> SELECT to_char(SYSDATE, 'mm/dd/yyyy') FROM dual;

TO_CHAR(SY
----------
02/06/2015

SQL>

DATE数据类型包含日期和时间元素

SQL> SELECT to_char(SYSDATE, 'mm/dd/yyyy hh24:mi:ss') dt_tm FROM dual;

DT_TM
-------------------
02/06/2015 11:28:32

SQL>

如果要在任何日期操作中使用 DATE 值,则无需将其转换为任何内容,只需将DATE值直接用于日期操作。

更新在OP上有关此查询的请求http://pastie.org/9891465

在该查询中,您不必在子查询中使用TO_CHAR。仅在主选择中使用TO_CHAR,因为这将显示值。子查询中的 start_date end_dt 是外部查询的INPUT,应保留为 DATE 值,无需转换将其改为字符串

SELECT LEVEL WEEK_NUM_INCR,
  TO_CHAR (start_date + (LEVEL - 1) * 7, 'WW') WEEK_POSITION
  /* WEEK POSITION FOR THE WHOLE YEAR */
  ,
  TO_CHAR (start_date + (LEVEL - 1) * 7, 'MM/DD/YYYY') START_WEEK_DATE,
  TO_CHAR (start_date + (LEVEL) * 7, 'MM/DD/YYYY') END_WEEK_DATE
FROM
  (SELECT PS.PROJECT_START_DT start_date,
    PS.PROJECT_END_DT end_date
  FROM PROJECT_SPAN PS
  WHERE PS.JOB_NAME = 'W-IGG'
  )
  CONNECT BY start_date + (LEVEL - 1) * 7 < end_date;