2011-05-19 25 views

Respuesta

5

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); 
+0

buenas obras muchas gracias – maxy56

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).

+1

Esto es muy sexy! ¡Buena respuesta! – Yuck

+0

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). –

+0

@Nicholas - Yo, y supongo que @WReach también, asumí una entrada validada. Alegrías por hacer una versión más segura. – Yuck

2

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) 
2
WITH m AS 
    SELECT Minutes = CAST(@hours * 60 AS int) 
) 
SELECT CAST(Minutes/60 AS varchar) + ':' + RIGHT(100 + Minutes % 60, 2) 
FROM m 
-1
select dateadd(MINUTE, cast((8.18 % 1) * 60 as int), dateadd(hour, cast(8.18 as int), convert(varchar(10), getdate(), 10))) 
Cuestiones relacionadas