2013-07-22 21 views
7

State lottando con questo e non riesco a trovare la risposta giusta, anche se ci sono molte menzioni per la conversione, ma non funziona nulla di specifico.Converti tempo decimale in ore e minuti

Ho bisogno di convertire un tempo con il tipo di dati del galleggiante in ore e minuti. Quindi 13.50 come 13.30. Il tipo di dati fisso come float nel DB non può quindi essere modificato. DB è SQL Server 2008R2

hanno provato:

cast(cast(floor(fdsViewTimesheet.perStandardHours) as  
float(2))+':'+cast(floor(100*( 
fdsViewTimesheet.perStandardHours - floor(fdsViewTimesheet.perStandardHours)))as 
float(2)) as time) AS STANDARD_HOURS 

Ma ottengo messaggio di errore "Explicit conversion from data type real to time is not allowed" hanno provato as char invece di as float ma di query si blocca.

Cosa sto sbagliando? Ho appena want to convert a float value into hours and minutes. Sarei grato se qualcuno potesse indicarmi la giusta direzione.

risposta

2

Questo dovrebbe funzionare per voi

DECLARE @f [real] 
SET @f = 13.50 

SELECT DATEADD(mi, (@f - FLOOR(@f)) * 60, DATEADD(hh, FLOOR(@f), CAST ('00:00:00' AS TIME))) 
+0

Come questo lavoro quando si utilizzano nomi di campo fdsViewTimesheet.perStandardHours? 13.50 era solo un esempio di dati nel campo fdsViewTimesheet.perStandardHours – user1022772

+0

Basta sostituire @f con fdsViewTimesheet.perStandardHours - job done :) –

+0

Il '13 .50 'nel tuo SQL è un esempio di formato per @f? Quindi dovrei sostituire tutti gli esempi di @f con fdsViewTimesheet.perStandardHours e mantenere 13.50 in? Grazie – user1022772

1

Che ne dite di convertire per minuti e aggiungere al tempo di 0:00 in questo modo:

DECLARE @c datetime 
select @c = dateadd(mi,fdsViewTimesheet.perStandardHours*60,'00:00') 

Se si voleva fare nella dichiarazione con Solo tempo:

select CONVERT(TIME,dateadd(mi,fdsViewTimesheet.perStandardHours*60,'00:00') ) 

Se i valori sono maggiori di 24 ore, quindi lo standard di data/ora e tempo pes in sql non può contenere questi. Sono limitati a tenere intervalli di 24 ore. cosa si avrebbe bisogno di fare è conservare la rappresentazione di tempo in una stringa, ad esempio in questo modo:

select cast(floor(fdsViewTimesheet.perStandardHours) as varchar(10)) + ':' + cast(FLOOR((fdsViewTimesheet.perStandardHours - floor(fdsViewTimesheet.perStandardHours))*60)as varchar(2)) 
+0

Converti funziona alla grande tranne quando ho un campo con oltre 24 ore. 37.5 è stato elaborato come 13.30? – user1022772

+1

Non è possibile utilizzare i tipi di dati datetime/time per memorizzare ore superiori a 24. Si prega di dare un'occhiata a questo articolo se si desidera imparare come elaborare le proprie formule: http://www.sqlteam.com/article/working -con-time-campate-e-durate-in-sql server –

2
DECLARE @f FLOAT = 13.5; 

SELECT CONVERT(TIME(0), DATEADD(MINUTE, 60*@f, 0)); 

O se volete semplicemente hh:mm come una stringa:

SELECT CONVERT(CHAR(5), DATEADD(MINUTE, 60*@f, 0), 108); 

Basta essere attenti se si dispone di valori> = 24.

4

si può provare:

DECLARE @HOURS decimal(7,4) = 20.5599 
SELECT CAST(CONVERT(VARCHAR,DATEADD(SECOND, @HOURS * 3600, 0),108) AS TIME) 

uscita: 20:33:35

Ma ricordate: Tipo Tempo in MSSQL solo sotto 24 ore

Se si desidera maggiore di 24 ore, provare:

DECLARE @HOURS decimal(7,4) = 25.5599 
SELECT 
RIGHT('0' + CAST (FLOOR(@HOURS) AS VARCHAR), 2) + ':' + 
RIGHT('0' + CAST(FLOOR((((@HOURS * 3600) % 3600)/60)) AS VARCHAR), 2) + ':' + 
RIGHT('0' + CAST (FLOOR((@HOURS * 3600) % 60) AS VARCHAR), 2) 

uscita: 25:33: 35

- Aggiornamento

minuti decimali a più di 24 ore

01.235.
DECLARE @MINUTES decimal(7,4) = 77.9 
SELECT 
RIGHT('0' + CAST (FLOOR(COALESCE (@MINUTES, 0)/60) AS VARCHAR (8)), 2) + ':' + 
RIGHT('0' + CAST (FLOOR(COALESCE (@MINUTES, 0) % 60) AS VARCHAR (2)), 2) + ':' + 
RIGHT('0' + CAST (FLOOR((@MINUTES* 60) % 60) AS VARCHAR (2)), 2); 

uscita: 01:17:54

Problemi correlati