将时间浮点数转换为格式 HH:mm sql 服务器
Convert time float to format HH:mm sql server
我需要将浮点十进制数格式化为时间格式hour:minute。
我用输入 float 和输出 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.
如何设置正确的输出?
使用函数格式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')
不是问题的解决方法,但也许是您可以利用的东西。标量函数的性能很糟糕。但是内联 table 值函数不是。您发布的函数可以很容易地转换为内联 table 值函数。请记住,这些必须只是一个 select 语句。如果你有变量,它就变成了一个多语句 table 值函数,性能会比标量函数更差。
以下是如何将该标量转换为内联 table 值函数。
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$
我需要将浮点十进制数格式化为时间格式hour:minute。
我用输入 float 和输出 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.
如何设置正确的输出?
使用函数格式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')
不是问题的解决方法,但也许是您可以利用的东西。标量函数的性能很糟糕。但是内联 table 值函数不是。您发布的函数可以很容易地转换为内联 table 值函数。请记住,这些必须只是一个 select 语句。如果你有变量,它就变成了一个多语句 table 值函数,性能会比标量函数更差。
以下是如何将该标量转换为内联 table 值函数。
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$