SQL: число с плавающей точкой в ​​формате часов - PullRequest
9 голосов
/ 19 мая 2011

Есть ли простой способ форматирования числа с плавающей точкой в ​​часах в Ms SQL Server 2008?

Примеры:

  • 1,5 -> 01: 30
  • 9,8 -> 09:48
  • 35,25 -> 35: 15

Большое спасибо.

Ответы [ 5 ]

6 голосов
/ 19 мая 2011

Мне нравится этот вопрос!

DECLARE @input float = 1.5;

DECLARE @hour int = FLOOR(@input);
DECLARE @minutes int = (SELECT (@input - FLOOR(@input)) * 60);

SELECT RIGHT('00' + CONVERT(varchar(2), @hour), 2) + ':' + RIGHT('00' + CONVERT(varchar(2), @minutes), 2);
3 голосов
/ 19 мая 2011
SELECT SUBSTRING(CONVERT(NVARCHAR, DATEADD(MINUTE, 1.5*60, ''), 108), 1, 5)

Это работает:

  • начиная с «нулевой» даты

  • добавление 1,5 х 60 минут (то есть 1,5 часа)

  • форматирование результата как времени, чч: мм: сс (т. Е. Формат «108»)

  • усечение части секунды

Необходимо использовать 1,5 x 60 минут вместо 1,5 часов, поскольку функция DATEADD усекает смещение до ближайшего целого числа.Если вы хотите смещения с высоким разрешением, вы можете вместо этого использовать SECOND с соответствующим масштабированием (например, часы * 60 * 60).

2 голосов
/ 19 мая 2011
WITH m AS
  SELECT Minutes = CAST(@hours * 60 AS int)
)
SELECT CAST(Minutes / 60 AS varchar) + ':' + RIGHT(100 + Minutes % 60, 2)
FROM m
2 голосов
/ 19 мая 2011

Конечно. Легко, но не совсем ... просто:

declare @hours float 
set     @hours = -9.8

select substring('-  ',2+convert(int,sign(@hours)),1)                                        -- sign
     + right('00' + convert(varchar,                       floor(abs(@hours)))         , 2 ) -- hours component
     + ':'                                                                                   -- delimiter
     + right('00' + convert(varchar,round( 60*(abs(@hours)-floor(abs(@hours))) , 0 ) ) , 2 ) -- minutes

Еще один вариант, который даст правильный результат. Возможно, вам придется настроить его на округление минут и убедиться, что оба поля имеют ширину 2 цифры.

declare @hours float 
set     @hours = -9.8

select       convert(varchar, datediff(minute,dateadd(minute,@hours*60,convert(datetime,'')),'') / 60 )
     + ':' + convert(varchar, datediff(minute,dateadd(minute,@hours*60,convert(datetime,'')),'') % 60 ) 
0 голосов
/ 22 августа 2017
select dateadd(MINUTE, cast((8.18 % 1) * 60 as int), dateadd(hour, cast(8.18 as int), convert(varchar(10), getdate(), 10)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...