Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql DB2将ISO 8601时间戳字符串转换为DB2时间戳_Sql_Db2 - Fatal编程技术网

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

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,

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

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