【问题标题】:Oracle:Update date column in a tableOracle:更新表中的日期列
【发布时间】:2012-12-19 17:15:42
【问题描述】:

以下是我抛出错误的 Oracle 更新查询--

更新表 Set col1 = To_date(:dateFill, 'mm/dd/yyyy hh24:mi:ss') 其中 Fil1 = :ID;

dateFill = 01/05/2012, ID= 15

这个语句在一个过程中执行,

错误 -:ORA-01722: 无效号码(日期字段)

谁能告诉我为什么'select To_date('01/05/2012 00:00:00', 'mm/dd/yyyy hh24:mi:ss') from dual;'给我像'05-JAN-2012 00:00:00'这样的结果。???

请给我一些答案。

【问题讨论】:

  • “Fil1”列的表数据类型是什么,它真的是 varchar2 吗?以及您定义的数据类型 :ID 是我假设的数字吗?
  • 这里的'Fil1'或'ID'没有问题,日期值有问题。Fil1是varchar2,'ID'是varchar2的变量。
  • 你说它在一个过程中运行,向我们展示你是如何绑定值的(dbms_sql/execute immediate),因为“:id”只有在我们谈论动态 sql 时才有效。还有你怎么知道日期部分的错误?
  • 不确定您是否注意到您的日期格式为'mm/dd/yyyy',它将'01/05/2012' 解释为January 5, 2012。这就是为什么你的结果是'05-JAN-2012...'。

标签: oracle10g


【解决方案1】:

如果 dateFill = 01/05/2012,为什么要指定包含“hh24:mi:ss”的日期格式?

【讨论】:

  • 这样做有什么问题?oracle 将接受 24 小时格式。
  • 那么您必须提供一个包含 hh24:mi:ss 组件的字符串。您格式化图片告诉 to_date 函数如何解释您传递给它的字符串。您告诉它将某些字符解释为小时/分钟/秒,但您没有在 dateFill 中提供这些字符
  • 我不必提供,默认显示'00:00:00'对吗?
  • 可以在 TO_DATE 中过度指定格式。关键是格式必须至少包含以正确格式传递的组件。即to_date('01/02/2012', 'dd/mm/yyyy hh24') 是有效的(尽管如果输入总是只到一天,则不是最好的)to_date('01/02/2012 04:12', 'dd/mm/yyyy hh24') 不是因为你没有考虑分钟(ora-01830)。
  • @user1495475 我相信这对于时间组件是正确的,但要小心假设它对于其他组件是正确的——我相信在某些情况下,省略的组件被设置为 sysdate 中的相应值。无论如何,给它一个测试。
【解决方案2】:

当尝试将字符串转换为数字时,出现 ORA-01722 错误,但无法将字符串转换为有效数字。有效数字包含数字“0”到“9”,可能有一个小数点,字符串开头或结尾的符号(+ 或 -),或“E”或“e”(如果它是浮点数)科学计数法中的点数)。

【讨论】:

    【解决方案3】:

    to_date 始终使用“字符”即

    to_date(char[,'format'[,nls_lang])
    

    您的变量'dateFill' 是数字数据类型。 Castconvert 这个 'dateFill' 将字段转换为 varchar 并且一切正常。

    【讨论】:

      【解决方案4】:

      谁能告诉我为什么是 'select To_date('01/05/2012 00:00:00', 'mm/dd/yyyy hh24:mi:ss') 来自双重;'给我这样的结果 '05-JAN-2012 00:00:00'.???

      日期显示方式取决于您的客户端/Nls 日期格式设置:

      SQL> select To_date('01/05/2012 00:00:00','mm/dd/yyyy hh24:mi:ss') from dual;
      
      TO_DATE('01/05/20120
      --------------------
      05-jan-2012 00:00:00
      
      SQL> alter session set nls_date_format='mm/dd/yyyy hh24:mi:ss';
      
      Session altered.
      
      SQL> select To_date('01/05/2012 00:00:00','mm/dd/yyyy hh24:mi:ss') from dual;
      
      TO_DATE('01/05/2012
      -------------------
      01/05/2012 00:00:00
      
      SQL>
      

      【讨论】:

        猜你喜欢
        • 2012-11-09
        • 1970-01-01
        • 2015-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        相关资源
        最近更新 更多