【问题标题】:DB2 - Argument 02 of function TRANSLATE not validDB2 - 函数 TRANSLATE 的参数 02 无效
【发布时间】:2016-07-10 02:30:58
【问题描述】:

我在使用 TRANSLATE 将字符串 (yyyymmddhhiiss) 转换为日期时遇到一些问题。

如果我直接使用字符串,那么它工作得非常好,但是当我使用完全相同数据类型的字段 varchar(14) 时,它会从标题中抛出错误。

这是我正在尝试做的一个基本示例:

WITH test_table AS (
    SELECT '20160101123059' AS d FROM SYSIBM.SYSDUMMY1
)
SELECT d
       , translate('ABCD-EF-GH IJ:KL:MN', d, 'ABCDEFGHIJKLMN')
       , translate('ABCD-EF-GH IJ:KL:MN', '20160101123059','ABCDEFGHIJKLMN')
  FROM test_table

你们中的哪一位能解释一下为什么这不起作用吗?谢谢。

【问题讨论】:

  • 这当然不是将字符串 (yyyymmddhhiiss) 转换为日期,而是将 [数字] 字符串重新格式化为时间戳格式的字符串 [其中包括日期和时间]。如果效果应该是 TIMESTAMP 数据类型,那么请参阅“直接使用 TIMESTAMP()”的评论。否则:关于如何使用子字符串实现目标的评论,未显示表达式,尽管无论使用什么,都可能有更简单的方法;例如两个几乎相同的变体:VARCHAR_FORMAT(d, 'YYYY-MM-DD HH:MI:SS')TO_CHAR(d, 'YYYY-MM-DD HH24:MI:SS')

标签: date db2 ibm-midrange translate db2-400


【解决方案1】:

来自 DB2 for i 手册...

到字符串
一个字符串,它指定特定的字符 表达式中的字符将被转换。这个字符串有时是 称为输出转换表。字符串必须是任何内置的 数字或字符串常量

所以它不会按照您尝试使用它的方式工作。

参数 2 必须是一个常数值。

假设 IBM i 的受支持版本,您应该能够使用 timestamp() 函数将 14 个字符的字符串直接转换为时间戳。

select timestamp('20160101123059')
from sysibm.sysdummy1             

【讨论】:

  • 感谢您的解释。我最终用 SUBSTR 手动格式化它。
  • @okdios,请参阅我关于直接使用TIMESTAMP() 的答案的补充
【解决方案2】:

你可以使用: TIMESTAMP_FORMAT('20160101123059' , 'YYYYMMDDHH24MISS')

如果你想要一个 char 结果: cast(TIMESTAMP_FORMAT('20160101123059' , 'YYYYMMDDHH24MISS') as varchar(50))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 2016-03-13
    相关资源
    最近更新 更多