Метка: sql seconds hour tsql

Перевод секунд в часы SQL

Перевод секунд в часы SQL

Классическая задача по программированию. Дано количество секунд, необходимо перевести их в часы в формате ЧЧ:ММ:СС.

Справка

  • 1 час = 60 минут = 3600 секунд
  • 1 день = 24 часа = 1440 минут = 86400 секунд

Находим количество часов как деление секунд на количество секунд в одном часе. Количество минут будет остача от деление на 3600 поделить на 60.

Количество секунд это остача от деления на 60.

Дано 10 000 секунд.

Часы: 10 000 / 3600 = 2 часа

Минуты: 10 000 % 3600 / 60 = 2800 / 60 = 46 минут

Секунды: 10 000 % 60 = 40 секунд

10 000 секунд = 2:46:40 часа.

В MS SQL запишем данный алгоритм:

DECLARE @Seconds int = 10000
SELECT [Hours]   = @Seconds / 3600
      ,[Minutes] = @Seconds % 3600 /60
      ,[Seconds] = @Seconds % 60

 

SQL
Результат запроса

Как видим 2 часа, 46 минут и 40 секунд. А что если нам необходимо выводить «0» перед числом, чтобы получилось 02:46:40?

Самое просто это сравнение полученного числа с 10. Если число меньше 10 добавляем 0 перед цифрой. Для проверки используем логическую функцию IIF

DECLARE @Seconds	int	= 10000
SELECT	 [Hours]	= @Seconds / 3600
    ,[Minutes]	= @Seconds % 3600 /60
    ,[Seconds]	= @Seconds % 60
SELECT	[HH:MM:SS]	=
   IIF(@Seconds / 3600 < 10, ''0'', '''')		+ CONVERT(nvarchar, @Seconds / 3600)		-- Часы
  + '':'' +
    IIF(@Seconds % 3600 /60 < 10, ''0'', '''')	+ CONVERT(nvarchar, @Seconds % 3600 /60)	-- Минуты
  + '':'' +
    IIF(@Seconds % 60 < 10,	''0'', '''')		+ CONVERT(nvarchar, @Seconds % 60)			-- Секунды

Результат:

SQL Result Pane
Результат запроса

Удобно использовать этот алгоритм в виде функции.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[SecondsToHour] (@Seconds int)
RETURNS nvarchar(max) 
AS
BEGIN
 DECLARE @result nvarchar(max)
 SET @result = 
  IIF(@Seconds / 3600 < 10, ''0'', '''') + CONVERT(nvarchar, @Seconds / 3600) -- Часы\
   + '':'' +
   IIF(@Seconds % 3600 /60 < 10, ''0'', '''') + CONVERT(nvarchar, @Seconds % 3600 /60) -- Минуты
   + '':'' +
   IIF(@Seconds % 60 < 10, ''0'', '''') + CONVERT(nvarchar, @Seconds % 60) -- Секунды
   return @result;
  END

 

 

SELECT [dbo].[SecondsToHour] ( 10000 )

 

Результат запроса

В MS SQL перевести секунды в часы можно воспользовавшись функцией DATEADD().\r\n

SELECT DATEADD(ss, @Seconds, ''00:00'')

 

1900-01-01 02:46:40.000

Установить формат ЧЧ:ММ:СС можно сделав конвертацию в 108 стиль.\r\n

SELECT CONVERT(nvarchar, DATEADD(ss, @Seconds, ''00:00''), 108)\r\n	02:46:40

Данный способ возвращает только 24 часа. От 00:00:00 до 23:59:59. При количестве секунд 86400 и более, счётчик дней увеличивается.

SELECT DATEADD(ss, 86405, ''00:00'')\r\n  1900-01-02 00:00:05.000