【问题标题】:ORA-01861: literal does not match format string not working with format in oracleORA-01861: 文字与格式字符串不匹配 在 oracle 中无法使用格式
【发布时间】:2022-01-24 15:56:29
【问题描述】:

我正在像这样2016-10-17T00:00:00+05:30 上传表格中的数据,并且在将数据提取到变量中时,我正在像这样使用它V_FINALSRDATE := cur_r.FINAL_SR_DATE

所以在执行它时,我收到ORA-01861: literal does not match format string 的错误。

所以我就这样尝试

V_FINALSRDATE := TO_DATE(cur_r.FINAL_SR_DATE,'dd-mm-yyyy');

请建议需要更改和更新的内容。

【问题讨论】:

  • 您提供给 TO_DATE 以用作格式模型的字符串文字必须与您尝试转换为日期的实际字符串匹配。在您的情况下,该模型似乎是'yyyy-mm-dd"T"hh24:mi:ss tzh:tzr' - 它不是“日期”格式,而是“带有时区的时间戳”。你想达到什么目的 - 你想丢弃时区信息吗?您是否意识到这样做会丢失信息?
  • FINAL_SR_DATE是什么数据类型?

标签: oracle stored-procedures plsql


【解决方案1】:

2016-10-17T00:00:00+05:30dd-mm-yyyy 格式不匹配,并且它有一个时区,因此无法将其转换为日期。

您应该将其存储在 TIMESTAMP WITH TIME ZONE 数据类型中:

DECLARE
  V_FINALSRDATE TIMESTAMP WITH TIME ZONE;
  -- create a cur_r cursor with FINAL_SR_DATE column.
BEGIN
  V_FINALSRDATE := TO_TIMESTAMP_TZ(cur_r.FINAL_SR_DATE,'YYYY-MM-DD"T"HH24:MI:SSTZH:TZM');
END;
/

如果您想将其转换为DATE,那么您可以使用类似:

DECLARE
  V_FINALSRDATE DATE;
  -- create a cur_r cursor with FINAL_SR_DATE column.
BEGIN
  V_FINALSRDATE := CAST(
    TO_TIMESTAMP_TZ(cur_r.FINAL_SR_DATE,'YYYY-MM-DD"T"HH24:MI:SSTZH:TZM')
    -- AT TIME ZONE 'UTC' -- Optionally, convert the date to a common time zone.
    AS DATE
  );
END;
/

db小提琴here

【讨论】:

  • 可以转换成日期(先用SUBSTR,去掉时区);一般来说,这是不明智的——但 OP 可以澄清。
  • @mathguy 使用CAST 将带有时区的时间戳转换为日期。根据要求,是否转换为通用时区。
猜你喜欢
  • 1970-01-01
  • 2017-08-24
  • 2015-01-11
  • 2010-11-26
  • 2012-10-09
  • 2014-11-30
相关资源
最近更新 更多