【问题标题】:ORA-01855: AM/A.M. or PM/P.M. requiredORA-01855:上午/上午或下午/下午必需的
【发布时间】:2012-03-28 16:26:26
【问题描述】:

我收到错误:ORA-01855: AM/A.M. or PM/P.M. required

当我尝试执行以下查询时。

  INSERT INTO TBL(ID,START_DATE) 
    values (123, TO_DATE ('3/13/2012 9:22:00 AM', 'MM/DD/YYYY HH:MI AM'))

我的START_DATE 列属于“日期”类型。

我已经执行了以下查询,它没有给出任何错误,在上述问题中仍然没有成功:

ALTER SESSION SET NLS_DATE_FORMAT = "MM/DD/YYYY HH:MI AM";

【问题讨论】:

  • 在询问问题时,如果您突出显示您的代码并按下编辑窗口顶部的{} 按钮,您的代码将被格式化,以便于阅读。在回答您的问题时,您在to_date 中有几秒钟的时间,但它们不包含在格式掩码中。
  • 本,我不想救SS。我只想保存到几分钟,然后是上午/下午。

标签: oracle date oracle10g nls-lang


【解决方案1】:

您的格式掩码必须与您要转换的字符串的格式相匹配。因此,您要么想将SS 添加到格式掩码中,要么从字符串中删除秒数

INSERT INTO TBL(ID,START_DATE) 
  values (123, TO_DATE ('3/13/2012 9:22:00 AM', 'MM/DD/YYYY HH:MI:SS AM'))

INSERT INTO TBL(ID,START_DATE) 
  values (123, TO_DATE ('3/13/2012 9:22 AM', 'MM/DD/YYYY HH:MI:SS AM'))

如果你想接受一个包含秒的字符串,但又不想将秒存储在数据库中(在这种情况下,Oracle 将始终存储 0 秒),你可以使用TRUNC 函数

INSERT INTO TBL(ID,START_DATE) 
  values (123, TRUNC( TO_DATE ('3/13/2012 9:22:00 AM', 'MM/DD/YYYY HH:MI:SS AM'), 'MI') )

【讨论】:

  • 如何从前端删除它。我从前端得到那个字符串。有没有办法可以更改/只允许该字符串出现。在前端,它是日期时间格式。
  • @RMN- 如果您总是希望将秒数存储为 0,我更新了我的答案以包括将DATE 截断为分钟的选项。
【解决方案2】:

我在运行表单生成器时遇到了同样的错误, 它已通过将归档数据类型从 TIME 更改为 CHAR 来修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-06
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多