2015-07-15 7 views
1

Я нашел функцию SQL, который получит второй в качестве входного параметра и возврата секунд дд: чч: мм: сс формат электронного г в течение 93600 секунд он возвращает 1:02:00:00Как отформатировать время от dd: hh: mm: ss до hh: mm: ss в SQL-сервере?

это означает 1 день 2 часа 0 минут 0 секунд.

Функция, я использовал это:

FUNCTION [dbo].[udfTimeSpanFromSeconds] 
(
    @Seconds int 
) 
RETURNS varchar(15) 
AS 
BEGIN 
DECLARE 
    --Variable to hold our result 
     @DHMS varchar(15) 
    --Integers for doing the math 
    , @Days int --Integer days 
    , @Hours int --Integer hours 
    , @Minutes int --Integer minutes 
    --Strings for providing the display 
    , @sDays varchar(5) --String days 
    , @sHours varchar(2) --String hours 
    , @sMinutes varchar(2) --String minutes 
    , @sSeconds varchar(2) --String seconds 

--Get the values using modulos where appropriate 
SET @Hours = @Seconds/3600 
SET @Minutes = (@Seconds % 3600) /60 
SET @Seconds = (@Seconds % 3600) % 60 

--If we have 24 or more hours, split the @Hours value into days and hours 
IF @Hours > 23 
BEGIN 
    SET @Days = @Hours/24 
    SET @Hours = (@Hours % 24) 
END 
ELSE 
BEGIN 
    SET @Days = 0 
END 

--Now render the whole thing as string values for display 
SET @sDays = convert(varchar, @Days) 
SET @sHours = RIGHT('0' + convert(varchar, @Hours), 2) 
SET @sMinutes = RIGHT('0' + convert(varchar, @Minutes), 2) 
SET @sSeconds = RIGHT('0' + convert(varchar, @Seconds), 2) 

--Concatenate, concatenate, concatenate 
SET @DHMS = @sDays + ':' + @sHours + ':' + @sMinutes + ':' + @sSeconds 

RETURN @DHMS 

END 

и выберите команду, которая будет получать выход

select dbo.udfTimeSpanFromSeconds('93600') 

это показывает мне результат:

enter image description here

Теперь мне нужно этот выход в формате hh:mm:ss, например, для пример 26:00:00 это означает 26 часов 0 минут и 0 секунд.

Я использую SQL Server 2008. Спасибо заранее.

+0

Я думаю, что это так просто, как снимаете, если условие. если условие преобразует час в дни. поэтому его удаление решит вашу проблему. Я не проверял, хотя, но думаю, что это сработает. –

+0

Вы хотите получить ожидаемый результат от выхода функции? Или вы хотите изменить логику в самой функции? – Jesuraja

+0

@Ankit Bajpai, После удаления, если он вернет мне null. – Waqas

ответ

2

вы можете сделать это с математикой

DECLARE @sec INT = 93600 

SELECT 
    CONVERT(VARCHAR(10), (@sec/3600)) + ':' + 
    RIGHT('0' + CONVERT(VARCHAR(2), ((@sec % 3600)/60)), 2) + ':' + 
    RIGHT('0' + CONVERT(VARCHAR(2), (@sec % 60)), 2) 

Написанное функции:

CREATE FUNCTION udfTimeSpanFromSeconds(
    @sec INT 
) 
RETURNS VARCHAR(15) 
AS 
BEGIN 
RETURN 
    CONVERT(VARCHAR(10), (@sec/3600)) + ':' + 
    RIGHT('0' + CONVERT(VARCHAR(2), ((@sec % 3600)/60)), 2) + ':' + 
    RIGHT('0' + CONVERT(VARCHAR(2), (@sec % 60)), 2) 
END 

Пример вызова:

SELECT dbo.udfTimeSpanFromSeconds(360000) 

РЕЗУЛЬТАТ:

100:00:00 
+1

Это отлично работает на миллионы секунд, благодаря вам. – Waqas

0

Если вы хотите вернуть функцию hh: mm: ss, тогда она должна быть такой, как показано ниже. Однако это ограничивает общее время менее 100 часов. Вы можете исправить это, увеличив длину строки часов, изменив правильное предложение и увеличив длину возвращаемой строки, как я теперь сделал для иллюстрации.

(Обычно, когда вы подвели свое время вы обычно делят сумму на 3600,00 для получения десятичного значения для использования в дальнейших расчетах, например, если вы платите за час)

FUNCTION [dbo].[udfTimeSpanFromSeconds] 
(
    @Seconds int 
) 
RETURNS varchar(10) 
AS 
BEGIN 
DECLARE 
    --Variable to hold our result 
     @HMS varchar(15) 
    --Integers for doing the math 
    , @Hours int --Integer hours 
    , @Minutes int --Integer minutes 
    --Strings for providing the display 
    , @sHours varchar(2) --String hours 
    , @sMinutes varchar(2) --String minutes 
    , @sSeconds varchar(2) --String seconds 

--Get the values using modulos where appropriate 
SET @Hours = @Seconds/3600 
SET @Minutes = (@Seconds % 3600) /60 
SET @Seconds = (@Seconds % 3600) % 60 

--Now render the whole thing as string values for display 
SET @sHours = RIGHT('0' + convert(varchar(5), @Hours), 3) 
SET @sMinutes = RIGHT('0' + convert(varchar(3), @Minutes), 2) 
SET @sSeconds = RIGHT('0' + convert(varchar(3), @Seconds), 2) 

--Concatenate, concatenate, concatenate 
SET @HMS = @sHours + ':' + @sMinutes + ':' + @sSeconds 

RETURN @HMS 

END 
+0

Когда я ввожу «360000» секунд, которые являются 100 часами, тогда он возвращает меня 00:00:00. – Waqas

+0

Вы никогда не должны использовать 'varchar' без длины в SQL Server. Длина по умолчанию зависит от контекста, и ошибки такого рода очень трудно найти. –

+0

Максимальный результат, который может возвращать функция, составляет 99:59:59 или 359999 секунд – Ewan

0

Если вы хотите вернуть 100 часов, то вы должны использовать: -

FUNCTION [dbo].[udfTimeSpanFromSeconds] 
(
    @Seconds int 
) 
RETURNS varchar(8) 
AS 
BEGIN 
DECLARE 
--Variable to hold our result 
    @HMS varchar(15) 
--Integers for doing the math 
, @Hours int --Integer hours 
, @Minutes int --Integer minutes 
--Strings for providing the display 
, @sHours varchar(3) --String hours 
, @sMinutes varchar(2) --String minutes 
, @sSeconds varchar(2) --String seconds 

--Get the values using modulos where appropriate 

SET @Hours = @Seconds/3600 
SET @Minutes = (@Seconds % 3600) /60 
SET @Seconds = (@Seconds % 3600) % 60 

--Now render the whole thing as string values for display 
SET @sHours = RIGHT('0' + convert(varchar, @Hours), 3) 
SET @sMinutes = RIGHT('0' + convert(varchar, @Minutes), 2) 
SET @sSeconds = RIGHT('0' + convert(varchar, @Seconds), 2) 

--Concatenate, concatenate, concatenate 
SET @HMS = @sHours + ':' + @sMinutes + ':' + @sSeconds 

RETURN @HMS 

END 
+0

он не работает, давая тот же результат 00:00:00, мне нужно добавить 24 на каждый 1-й прирост. – Waqas

+0

Теперь попробуйте мое редактирование. и ответьте –

+0

на самом деле "SET @sHours = RIGHT ('0' + convert (varchar, @Hours), 2)" строка дает 2 символа справа, в результате получается 00 instaed из 100. Я изменил его на 3. так он будет return as 100. –