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

时间:2012-11-09 08:12:24

标签: time db2 mainframe

在大型机上使用DB2,我有一个值,表示作业所用的微秒数,比如26,366,861,945

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

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

如果超过24小时,我不会对显示日期表示不满,27:02:14会没事的。

我虽然选择了零时间plus xx microseconds,但无法让它发挥作用。

2 个答案:

答案 0 :(得分:2)

嗯,这绝对是残暴的,但这应该有效:

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

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

答案 1 :(得分:0)

尝试这样的事情(我无法测试):

TIMESTAMP_ISO('0000-00-00-00:00:00.000000') + MICROSECOND(DB2_TABLE.DB2_COLUMN)

时间计算DB2 Basics: Fun with Dates and Times 时间戳功能TIMESTAMP_ISO