将午夜以来的毫秒数转换为可读的时间戳

时间:2019-08-23 11:05:33

标签: db2

我有一个应用程序,它记录自午夜以来执行操作的时间(以毫秒为单位),并将其存储在Db2 10.5数据库表中。我需要将该图转换为人类可读的时间戳输出。

SELECT ACTION_NAME, 
ACTION_TIME
FROM ACT.ACTIONS

ALARM1 1818000
ALARM2 76500000 

我希望能够运行SELECT,但是返回的值就像

ALARM1 05:03
ALARM2 21:15

任何指导将不胜感激。

3 个答案:

答案 0 :(得分:1)

您可以将秒数添加到“午夜”:

SELECT action_name, time '00:00' + (action_time/1000) second as action_time
FROM actions;

Online example(基于DB2 11.1)

答案 1 :(得分:0)

Db2中有一种TIME类型:

  

TIME函数从一个值返回一个时间。

所以我们可以使用它。 我们仍然需要DATETIMETIMESTAMP作为输入,而不是INT。因此,让我们尝试使用TIMESTAMP。我们可以这样获取当前日期的时间戳;

db2 "values timestamp(current date)"

1                  
-------------------
2019-08-23-00.00.00

  1 record(s) selected.

现在,我们可以简单地以秒或微秒为单位添加偏移量。例如。 76500000:

db2 "values timestamp(current date) + (76500000/1000) seconds"

1                  
-------------------
2019-08-23-21.15.00

  1 record(s) selected.

随时间推移:

db2 "values time(timestamp(current date) + (76500000/1000) seconds)"

1       
--------
21:15:00

我们的数据:

db2 "create table ACT.ACTIONS(action_name varchar(10), action_time int)"
db2 "insert into ACT.ACTIONS values ('ALARM1',1818000)"
db2 "insert into ACT.ACTIONS values ('ALARM2',76500000)"
db2 "select action_name, time( timestamp(current date) + (action_time/1000) seconds) as time from act.actions"

ACTION_NAME TIME    
----------- --------
ALARM1      00:30:18
ALARM2      21:15:00

  2 record(s) selected.

(请注意,您的示例中可能有一个错误)

编辑: 如前所述,不需要使用CURRENT TIMESTAMP,我没有注意到我们可以使用时间的STRING表示形式,即将'00:00'用作显示的@a_horse_with_no_name:

db2 "select action_name, time('00:00')  + (action_time/1000) seconds as action_time_fmt from act.actions"

ACTION_NAME ACTION_TIME_FMT
----------- ---------------
ALARM1      00:30:18       
ALARM2      21:15:00       

  2 record(s) selected.

答案 2 :(得分:0)

如果需要毫秒部分,可以执行例如

values timestamp('0001-01-01') + (1818005 / 1000) seconds + (mod(1818005,1000)*1000) microseconds"

1                         
--------------------------
0001-01-01-00.30.18.005000

1 record(s) selected.