【问题标题】:SQL Convert Seconds into Day:Hour:Min:SecSQL 将秒转换为日:时:分:秒
【发布时间】:2011-06-09 08:30:14
【问题描述】:

主题说明了一切。我正在尝试通过一个函数来做一些魔术,将第二个整数转换为字符串“DD:HH:MM:SS”。

截图

输入:278543
输出:“3D 5H 22M 23S”

如果可能的话,我想做的更优雅的是填充数字(以便 5M 显示为 05M)并将它们右对齐,以便“3D 5H 22M 23S”改为“3D 5H 22M 23S”。

edit:最近的剪辑似乎有效。希望它更漂亮,但据我所知,这绝对有效:

CREATE FUNCTION DHMS(secondsElapsed INT)
RETURNS Char(20)
LANGUAGE SQL
NO EXTERNAL ACTION
DETERMINISTIC

BEGIN
    DECLARE Dy Integer;
    DECLARE Hr Integer;
    DECLARE Mn Integer;
    DECLARE Sc Integer;

    SET Dy = Cast(     secondsElapsed / 86400         as Int);
    SET Hr = Cast(MOD( secondsElapsed, 86400 ) / 3600 as Int);
    SET Mn = Cast(MOD( secondsElapsed, 3600 ) / 60    as Int);
    SET Sc = Cast(MOD( secondsElapsed, 60 )           as Int); 

     RETURN REPEAT(' ',6-LENGTH(RTRIM(CAST(Dy AS CHAR(6))))) || Dy || 'D ' 
         || REPEAT('0',2-LENGTH(RTRIM(CAST(Hr AS CHAR(6))))) || Hr || 'H ' 
         || REPEAT('0',2-LENGTH(RTRIM(CAST(Mn AS CHAR(6))))) || Mn || 'M '
         || REPEAT('0',2-LENGTH(RTRIM(CAST(Sc AS CHAR(6))))) || Sc || 'S';
END

【问题讨论】:

  • 输入值是否以秒数反映时间?
  • 是的。更新澄清。

标签: datetime string db2


【解决方案1】:

您使用 LPAD() 是在正确的轨道上,因为它可以用零或任何其他字符串填充。 CHAR(15) 不足以按照您想要的方式格式化输出,并且仍然允许五个位置用于天数,这是您在代码中指定的长度。

CREATE OR REPLACE FUNCTION DHMS(secondsElapsed INT)
RETURNS Char(18)
LANGUAGE SQL
NO EXTERNAL ACTION
DETERMINISTIC

RETURN LPAD( secondsElapsed / 86400 , 5 ) || 'D ' 
  || LPAD( MOD( secondsElapsed, 86400 ) / 3600, 2, '0') || 'H ' 
  || LPAD( MOD( secondsElapsed, 3600 ) / 60, 2, '0' ) || 'M '
  || LPAD( MOD( secondsElapsed, 60 ), 2, '0' ) || 'S'
;

【讨论】:

  • 坏消息是我的部分问题是 LPad 在 DB2 中不起作用(所以问题有点不诚实)。将用我最终为使其正常工作所做的工作来编辑问题。你的数学部分肯定更简洁。另外......“创建或替换”在 DB2 中也不起作用,我认为......如果这样做会更酷,因为我有单独的 drop/create 调用,我必须单独运行。
  • 您好,您运行的是什么平台和版本的 DB2?我发布的代码适用于 DB2 9.7 for Linux、UNIX 和 Windows。
【解决方案2】:

声明@seconds int 设置@seconds = 900000000 select cast(@seconds/86400 as varchar(50))+':'+Convert(VarChar, DateAdd(S, @seconds, 0), 108)

【讨论】:

    猜你喜欢
    • 2011-03-11
    • 2017-11-22
    • 2013-06-08
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    相关资源
    最近更新 更多