我有一个要求,我得到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
答案 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)值。一旦取消装箱,我对它们进行了比较,一旦我得到最大值,我就把它装箱了。
取消装箱(已使用REPLACE
和TO_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