¿Existe alguna manera fácil de formatear un número flotante en horas en MS SQL Server 2008?SQL: formato de número flotante a horas
Ejemplos:
- 1,5 -> 01:30
- 9.8 -> 09:48
- 35.25 -> 35:15
muchas gracias.
¿Existe alguna manera fácil de formatear un número flotante en horas en MS SQL Server 2008?SQL: formato de número flotante a horas
Ejemplos:
muchas gracias.
Me gusta esta pregunta!
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);
SELECT SUBSTRING(CONVERT(NVARCHAR, DATEADD(MINUTE, 1.5*60, ''), 108), 1, 5)
Esto funciona por:
a partir de la fecha de "cero"
la adición de 1,5 x 60 minutos (es decir, 1,5 horas)
Formateo de la resultado como un tiempo, hh: mm: ss (es decir, formato "108")
el recorte de la parte segundo
Es necesario el uso de 1,5 x 60 minutos en lugar de 1,5 horas como la función DATEADD
trunca el desplazamiento al entero más cercano. Si desea compensaciones de alta resolución, puede usar SECOND
en su lugar, escala adecuada (por ejemplo, horas * 60 * 60).
Esto es muy sexy! ¡Buena respuesta! – Yuck
No funcionará cuando el valor 'flotar 'sea mayor o igual a 24. Obtendrá el módulo de tiempo 24 horas (por ejemplo, si X es 35.0, no obtendrá' 35: 00' sino '11:00 '(35 módulo 24). –
@Nicholas - Yo, y supongo que @WReach también, asumí una entrada validada. Alegrías por hacer una versión más segura. – Yuck
Sure. Fácil, pero no exactamente ... sencillo:
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
Otra opción que dará el resultado correcto. Es posible que deba modificarlo en minutos redondos y para garantizar que ambos campos tengan 2 dígitos de ancho.
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)
WITH m AS
SELECT Minutes = CAST(@hours * 60 AS int)
)
SELECT CAST(Minutes/60 AS varchar) + ':' + RIGHT(100 + Minutes % 60, 2)
FROM m
select dateadd(MINUTE, cast((8.18 % 1) * 60 as int), dateadd(hour, cast(8.18 as int), convert(varchar(10), getdate(), 10)))
buenas obras muchas gracias – maxy56