2013-07-22 20 views
7

Zmagam się z tym i nie mogę znaleźć właściwej odpowiedzi, chociaż jest wiele wzmianek o konwersji, ale nic konkretnego nie działa.Konwersja czasu dziesiętnego na godziny i minuty

Konieczna jest konwersja czasu z typem danych zmiennoprzecinkowych na godziny i minuty. Tak więc 13,50 jako 13,30. Typ danych ustawiony jako zmienny w DB, więc nie można go zmienić. DB jest SQL Server 2008R2

Próbowałem:

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

Ale otrzymuję komunikat o błędzie "Explicit conversion from data type real to time is not allowed" Próbowałem as char zamiast as float ale zapytania wisi.

Co robię źle? Właśnie want to convert a float value into hours and minutes. Byłbym wdzięczny, gdyby ktoś wskazał mi właściwy kierunek.

Odpowiedz

2

To powinno działać dla ciebie

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

Jak to będzie działać przy użyciu nazwy pola fdsViewTimesheet.perStandardHours? 13,50 był tylko przykładem danych w polu fdsViewTimesheet.perStandardHours – user1022772

+0

Wystarczy zastąpić @ f fdsViewTimesheet.perStandardHours - zadanie wykonane :) –

+0

Czy '13 .50 'w twoim SQL jest przykładem formatu @f? Czy chciałbym zastąpić wszystkie przykłady @ f fdsViewTimesheet.perStandardHours i zachować 13.50 w? Dzięki – user1022772

1

Jak o konwersji na minuty i dodać do czasu 00:00 tak:

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

Jeśli chcesz to zrobić w sprawozdaniu z Tylko czas:

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

Jeśli masz wartości większe niż 24 godziny, wtedy standardowa data i godzina pes w sql nie może ich zatrzymać. Są ograniczone do utrzymywania 24-godzinnych zakresów. Co trzeba zrobić, to zapisać reprezentacji czasu w ciągu znaków na przykład tak:

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

Konwersja działa świetnie, z wyjątkiem sytuacji, gdy mam pole z ponad 24 godzinami. 37,5 jest wypracowany jako 13,30? – user1022772

+1

Nie można używać typów danych typu godzina/godzina do przechowywania godzin powyżej 24. Zapoznaj się z tym artykułem, jeśli chcesz dowiedzieć się, jak wymyślić własne formuły: http://www.sqlteam.com/article/working -w czasie-rozpiętości-i-czasy-w-sql-serwerze –

2
DECLARE @f FLOAT = 13.5; 

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

lub jeśli po prostu chcesz hh:mm jako wyrażenie:

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

Wystarczy być ostrożnym jeśli mają wartości> = 24.

4

można spróbować:

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

Wyjście: 20:33:35

Ale pamiętaj: Typ Czas MSSQL tylko pod 24godz

Jeśli chcesz większy niż 24 godziny, spróbuj:

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) 

wyjściowa: 25:33: 35

- Aktualizacja

dziesiętne minut do ponad 24 godzin

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

Wyjście: 01:17:54

Powiązane problemy