DB2将ISO 8601时间戳字符串转换为DB2时间戳

时间:2014-06-11 11:15:19

标签: sql db2

我有一个要求,我得到ISO 8601时间戳格式的两个字符串,我必须比较它们并获得它们的最大时间戳。字符串采用以下格式。

2014-06-11T16:45:45Z

要进行比较,我需要将它们转换为DB2时间戳,然后进行比较。问题在于“T”和“Z”字母。因此,我无法施展。我知道我可以简单REPLACE T和Z演员,但我想知道是否有更好的方法。

我尝试了以下功能,但未能获得所需的结果。

to_date, to_timestamp, varchar_format, cast as

使用DB2 LUW v9.7

2 个答案:

答案 0 :(得分:1)

首先,好消息:你的值是SARGable,只是比较它们作为字符串将返回正确的结果(MAX(...)将根据需要工作)。这对铸造没什么帮助,但至少它仍然吐出了更大的"更多的"值。

对于演员来说,你可以在这里做几件事。

首先,只要您的日期/时间部分保持该格式,可能更容易单独抓取它们并重新组合时间戳:

TIMESTAMP(SUBSTR(@inputParm, 1, 10), SUBSTR(@inputParm, 12, 8)) AS resultTimestamp

LUW还有一个名为TIMESTAMP_FORMAT的函数(TO_TIMESTAMP在技术上是这个的同义词)。我假设系统实际上是因为您的传入数据中没有小数秒而窒息。我建议尝试这样的事情:

TIMESTAMP_FORMAT('YYYY-MM-DD HH24:MI:SS ', @inputParm)

然而,更好的选择可能是让任何人调用你的数据库传入一个类型为timestamp而不是string的参数 - 这意味着你不会&#39 ; t必须做任何转换变通办法。

答案 1 :(得分:0)

除了我的值为Sargable(正如发条 - 缪斯所提及)之外,我仍然继续编写代码 Unbox (ISO 8601 String to Timestamp)和 Box (Timestamp to ISO 8601 String)值。一旦取消装箱,我对它们进行了比较,一旦我得到最大值,我就把它装箱了。

取消装箱(已使用REPLACETO_TIMESTAMP功能):

SELECT 
   TO_TIMESTAMP(REPLACE(REPLACE('2014-04-14T15:19:45Z','T',' '),'Z',''),'YYYY-MM-DD HH24:MI:SS')
FROM SYSIBM.SYSDUMMY1;

拳击(取消装箱会附加额外的 .0 微秒,因此也会替换它)

SELECT REPLACE(REPLACE('2014-04-14 15:19:45.0',' ','T'),'.0','Z')
FROM SYSIBM.SYSDUMMY1