SQL конвертировать секунды в день: час: мин: сек - PullRequest
0 голосов
/ 14 января 2011

В теме все сказано.Я пытаюсь творить магию через функцию, которая превращает второе целое число в строку «DD: HH: MM: SS».

Snip

input: 278543
output: "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

Ответы [ 2 ]

2 голосов
/ 16 января 2011

Вы были на правильном пути, используя 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'
;
1 голос
/ 26 марта 2013

объявление @seconds int set @seconds = 900000000 выбор приведения (@ секунд / 86400 как varchar (50)) + ':' + Convert (VarChar, DateAdd (S, @seconds, 0), 108)

...