Sql DB2将ISO 8601时间戳字符串转换为DB2时间戳
我有一个要求,我得到两个ISO 8601时间戳格式的字符串,我必须比较它们并得到它们的最大时间戳。字符串的格式如下Sql DB2将ISO 8601时间戳字符串转换为DB2时间戳,sql,db2,Sql,Db2,我有一个要求,我得到两个ISO 8601时间戳格式的字符串,我必须比较它们并得到它们的最大时间戳。字符串的格式如下 2014-06-11T16:45:45Z 为了进行比较,我需要将它们转换为DB2时间戳,然后进行比较。问题在于“T”和“Z”字母。因此,我无法施展。我知道我可以简单地替换T和Z和cast,但我想知道是否有更好的方法 我尝试了以下功能,但未能获得预期的结果 to_date, to_timestamp, varchar_format, cast as 首先使用DB2LUWV9.7,
2014-06-11T16:45:45Z
为了进行比较,我需要将它们转换为DB2时间戳,然后进行比较。问题在于“T”和“Z”字母。因此,我无法施展。我知道我可以简单地替换T和Z和cast,但我想知道是否有更好的方法
我尝试了以下功能,但未能获得预期的结果
to_date, to_timestamp, varchar_format, cast as
首先使用DB2LUWV9.7,好消息是:您的值是可搜索的,也就是说,将它们作为字符串进行比较将返回正确的结果(MAX(…)
将根据需要工作)。这对施法没有帮助,但至少它仍然会吐出“更大”的值
对于演员,你可以在这里做一些事情
首先,只要您的日期/时间部分保持该格式,就可能更容易单独获取它们并重新组合为时间戳:
TIMESTAMP(SUBSTR(@inputParm, 1, 10), SUBSTR(@inputParm, 12, 8)) AS resultTimestamp
LUW还有一个名为(TO_TIMESTAMP
在技术上是这个的同义词)的函数。我假设系统实际上是因为传入数据中没有小数秒而窒息的。我建议您尝试以下方式:
TIMESTAMP_FORMAT('YYYY-MM-DD HH24:MI:SS ', @inputParm)
但是,更好的选择可能是让调用db的人传入一个作为时间戳键入的参数,而不是作为字符串键入的参数,这意味着您根本不必做任何转换工作。除了我的值是可搜索的以外
(正如发条缪斯所提到的,我仍然继续写代码,将值取消装箱(ISO 8601字符串到时间戳)和装箱(时间戳到ISO 8601字符串)。一旦取消装箱,我将它们进行比较,一旦得到最大值,我将其装箱
取消装箱(使用替换
和到时间戳
功能):
装箱(取消装箱会附加一个额外的.0微秒,因此也要替换它)
Sargable
对我来说已经足够好了。如果我不需要强制转换就可以直接进行比较,那就太完美了。谢谢你指出这一点。TO_TIMESTAMP
函数没有太大帮助,因为它最后增加了.0微秒的额外时间(这在比较时不是问题,但在将其转换回原始输入ISO 8601格式时是问题).关于最后一个建议,没有人调用我们的数据库。我们正在从输入XML读取日期,这是无法更改的,因为还有其他系统也接受这种格式。为了在最后转换回字符串时处理结果,您可以使用(不幸的是,我不认为它会把't'
或'Z'
放回去,但你可以试试)。你真的将时间戳存储为字符串吗?这可能会在以后给你带来问题。。。
SELECT
TO_TIMESTAMP(REPLACE(REPLACE('2014-04-14T15:19:45Z','T',' '),'Z',''),'YYYY-MM-DD HH24:MI:SS')
FROM SYSIBM.SYSDUMMY1;
SELECT REPLACE(REPLACE('2014-04-14 15:19:45.0',' ','T'),'.0','Z')
FROM SYSIBM.SYSDUMMY1