Преобразовать время с плавающей точкой в ​​формат ЧЧ: мм sql сервер

Мне нужно отформатировать десятичное число с плавающей точкой в ​​формате времени час: минута.

Я написал эти функции со скалярными значениями с помощью входного числа с плавающей точкой и выходного значения varchar(6):

CREATE FUNCTIONE formatOre ( @input float )
returns varchar(6) 
as
begin
declare @n float;
declare @hour int = floor(@input);
declare @minutes int = (select (@input - floor(@input)) * 60);
declare @val varchar(6)

set @val = right('00' + convert(varchar(2), @hour), 2) + ':' + right('00' + convert(varchar(2), @minutes), 2);

return @val

end

Это выглядит здорово, но не для всех записей. Это мой вывод:

select formatOre (0)    ---> 00:00
select formatOre (0.17) ---> 00:10
select formatOre (0.25) ---> 00:15
select formatOre (0.33) ---> 00:19
select formatOre (0.42) ---> 00:25
select formatOre (0.5)  ---> 00:30
select formatOre (0.58) ---> 00:34
select formatOre (0.67) ---> 00:40
select formatOre (0.75) ---> 00:45
select formatOre (0.83) ---> 00:49
select formatOre (0.92) ---> 00:55

Как видно из результатов, существует 3 неправильных преобразования: 0,33 = 00:19 // 0,58 = 00:34 // 0,83 = 00:49.

Как мне установить правильный выход?

3 ответа

Решение

Используйте функцию FORMAT SQL 2012+ https://docs.microsoft.com/en-us/sql/t-sql/functions/format-transact-sql

DECLARE  @input float = 4.92    
SELECT FORMAT(FLOOR(@input)*100 + (@input-FLOOR(@input))*60,'00:00')

Не решение проблемы, но, возможно, то, что вы можете использовать. Скалярные функции ужасны для производительности. Но встроенных табличных функций нет. Размещенную вами функцию можно очень легко преобразовать в встроенную табличную функцию. Имейте в виду, что они должны быть ТОЛЬКО одним оператором выбора. Если у вас есть переменные и тому подобное, они становятся табличной функцией с несколькими утверждениями, и производительность будет даже хуже, чем скалярная функция.

Вот как вы можете преобразовать этот скаляр в встроенную табличную функцию.

CREATE FUNCTION formatOre 
(
    @input float 
)
returns table as return

select right('00' + convert(varchar(2), floor(@input)), 2) + ':' + right('00' + convert(varchar(2), floor((@input - floor(@input)) * 60)), 2)

Вы можете попробовать это

 SELECT FORMAT(FLOOR(ColumnNAme) + (ColumnNAme -FLOOR(ColumnNAme)),'00.00') from TableName

Выход

Чтобы отобразить 4.92 как '04:55':

SELECT FORMAT(DATEADD(minute, 4.92 * 60, '2000-01-01'), 'HH:mm')
INSERT INTO t_att_inout(MM  ,YYYY   ,   DATE,EmpCode    ,Type   ,InTime,    OutTime)
select 10 as MM,2020 as YYYY, CONVERT(DATE,LEFT([Att Date],2)+'-OCT-2020',106),
emp_code,'fboth'as type,  
CONVERT(TIME(7),CONVERT(VARCHAR,FLOOR([in time]))+':'+RIGHT('00'+CONVERT(VARCHAR,CONVERT(INT,([In Time]-FLOOR([In Time]))*100)),2)),  
CONVERT(TIME(7),CONVERT(VARCHAR,FLOOR([out time]))+':'+RIGHT('00'+CONVERT(VARCHAR,CONVERT(INT,([Out time]-FLOOR([Out time]))*100)),2)) --,[IN time],[out time]
from CGAttend10$    
Другие вопросы по тегам