无法在oracle中将varchar2转换为Date

时间:2015-05-28 08:35:48

标签: sql oracle datetime date-arithmetic

我正在尝试使用以下查询将其中一个varchar2列转换为oracle中的日期。

SELECT *
FROM login
WHERE to_date(END_DATE,'DD-MM-YY') < to_date(TRUNC(SYSDATE)-90,'DD-MM-YY');

我正在使用通用格式化程序将双方转换为日期。但是在执行此查询时我仍然遇到以下错误。

 ORA-01861: literal does not match format string
  01861. 00000 -  "literal does not match format string"
 *Cause:    Literals in the input must be the same length as literals in
       the format string (with the exception of leading whitespace).  If the
       "FX" modifier has been toggled on, the literal must match exactly,
       with no extra whitespace.
 *Action:   Correct the format string to match the literal

你能帮我解决一下这个问题吗?

1 个答案:

答案 0 :(得分:1)

  

TO_DATE(END_DATE,&#39; DD-MM-YY&#39)

  • 首先,将 DATE 存储为 STRING 错误设计。日期应始终存储为DATE数据类型,没有理由将其存储为字符。

  • 如果您的数据存储为14-Mar-2015,那么为什么使用'DD-MM-YY'格式。显然,这些格式并不匹配。您应该使用正确的格式模型

例如,

TO_DATE(14-Mar-2015,'DD-Mon-YYYY','NLS_DATE_LANGUAGE=ENGLISH')
  

TO_DATE(TRUNC(SYSDATE)-90,&#39; DD-MM-YY&#39)

  • 这没有任何意义。截断时间部分后, DATE 上的 TRUNC 会返回DATE。

  • 永远不要在 DATE 上使用 TO_DATE 它会隐式将其转换为字符串,然后使用 特定于语言环境的NLS格式重新更新。请参阅我之前的答案https://stackoverflow.com/a/29559609/3989608

  • 中的详细说明

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

SELECT *
FROM login
WHERE to_date(END_DATE,'DD-Mon-YYYY','NLS_DATE_LANGUAGE=ENGLISH') < TRUNC(SYSDATE)-90;