Time 如何在DB2/z中将微秒转换为H:MM:SS.mmmm

Time 如何在DB2/z中将微秒转换为H:MM:SS.mmmm,time,db2,mainframe,Time,Db2,Mainframe,在大型机上使用DB2,我有一个值指示一个作业所花费的微秒数,比如26366861945 是否有任何简单的方法可以使用标准DB2函数将其转换为H:MM:SS.mmmm格式?换句话说,上面的值将变成7:19:26.861945 如有必要,我们可以降低微秒并接受HH:MM:SS 如果超过24小时,我不担心显示日期,27:02:14就可以了 我考虑过选择零时间加xx微秒,但无法使其工作。好吧,这绝对是很糟糕的,但这应该可以工作: WITH ORIG (TS) AS ( SELECT BIGIN

在大型机上使用DB2,我有一个值指示一个作业所花费的微秒数,比如26366861945

是否有任何简单的方法可以使用标准DB2函数将其转换为H:MM:SS.mmmm格式?换句话说,上面的值将变成7:19:26.861945

如有必要,我们可以降低微秒并接受HH:MM:SS

如果超过24小时,我不担心显示日期,27:02:14就可以了


我考虑过选择零时间加xx微秒,但无法使其工作。

好吧,这绝对是很糟糕的,但这应该可以工作:

WITH

ORIG (TS) AS (
    SELECT BIGINT(REPLACE('26,366,861,945', ',', ''))
    FROM SYSIBM.SYSDUMMY1
),

CONV (TS) AS (
    SELECT TIMESTAMP_ISO('0001-01-01') + (SELECT TS FROM ORIG) MICROSECOND
    FROM SYSIBM.SYSDUMMY1
),

FMT (TS) AS (
    SELECT VARCHAR_FORMAT(TS, 'DD-HH24:MI:SS.FF')
    FROM CONV
),

DAYLOC (D) AS (
    SELECT LOCATE('-', TS)-1
    FROM FMT
),

HOURLOC (H) AS (
    SELECT LOCATE(':', TS, (SELECT D FROM DAYLOC))-1
    FROM FMT
),

DY (D) AS (
    SELECT CAST(SUBSTR(TS, 1, LOCATE('-', TS)-1) AS INTEGER)-1
    FROM FMT
),

HOURS (H) AS (
    SELECT CAST(SUBSTR(TS, (SELECT D FROM DAYLOC)+2, 2) AS INTEGER)
    FROM FMT
)

SELECT 
    RTRIM(CHAR(((SELECT D FROM DY) * 24) + (SELECT H FROM HOURS))) ||
    SUBSTR(TS, (SELECT H FROM HOURLOC) +1)
FROM FMT

我把它分成几个部分,所以应该很容易理解。将字符串转换为整数,将其添加到一个特定的日期,只要它是一个月的第一天,日期就无关紧要,然后使用一些字符串搜索/格式将其转换为小时而不是天。

尝试类似的方法我无法测试:

TIMESTAMP_ISO('0000-00-00-00:00:00.000000') + MICROSECOND(DB2_TABLE.DB2_COLUMN)
时间计算
时间戳函数

计算出每个时间单位并将值连接在一起如何?虽然看起来不好看……同意,但不好看:你在这里遇到了两个不同的问题:1。时间类型不能添加除小时、分钟或秒以外的持续时间。2.顺便说一句,时间类型不允许值在小时内大于24,这表明时间类型用于瞬间,而不是持续时间。你想把它当作一个字符串,还是什么?为什么不把它作为一个持续时间,在展览上翻译它呢?你是对的,那太糟糕了。但这不会是我们代码库中最糟糕的事情:-我会在周一早上试一试,看看它是如何运行的我家里没有主机。什么?谁不把备用主机挂在家里我在z/OSDB2V9.1上测试了这一点。很明显,如果你的工作持续时间超过31天,这是行不通的。不过,我也不认为BIGINT会持续那么多微秒。我对这个代码摇得很厉害,但我认识到它背后的天才。好极了,帕斯迪亚布洛,好极了!你永远不知道,也许有人在家里偷偷操纵大力士可以测试一下这不起作用,DB2说错误[22007][IBM][DB2]SQL0180N日期时间值的字符串表示语法不正确。SQLSTATE=22007。另外,我不认为TIMESTAMP_ISO函数会按照您的意愿工作。如果您只给出一个时间,那么它会自动将日期部分设置为当前日期。我忘记了时间戳有日期信息,请使用更新的查询重试。我不确定是否允许使用日期0000-00-00,如果不允许,请将DB2表的日期值放低,如1900-01-01,并忽略日期部分。