2016-07-12 9 views
1

Ich habe eine table mit Stunde values. Ich brauche den Stundenwert in AM/PM-Format zu konvertieren, wie hier gezeigt:Integer-Wert in Stundenwert (AM/PM) in SQL Server konvertieren

val hour 
--------------- 
9  9:00 AM 
19  7:00 PM 
10 10:00 AM 
19  7:00 PM 
14  2:00 PM 

ich diese Logik versucht haben:

declare @timing varchar(5)='15:02' 

declare @time time=cast(@timing as time) 
select convert(varchar(50),@time, 100) 

Aber dies erfordert val in varchar umgewandelt werden. Gibt es eine andere Möglichkeit oder eingebaute Funktion in SQL Server, um dies zu tun?

+1

Was bedeutet "* convert *" hier? In der Datenbank ersetzen oder in der Abfrageausgabe formatieren? –

+2

Welche Version von SQL Server verwenden Sie? – Sankar

+0

@ PM77-1 ja die Ausgabe muss im AM/PM Format sein – bmsqldev

Antwort

1
SELECT FORMAT(DATEADD(hh,val,'00:00:00'),'hh:mm tt') 
FROM YourTable 
+0

'FORMAT' ist nur auf SQL Server 2012 und höher verfügbar. – Sankar

2

Versuchen Sie Folgendes:

SELECT TIMEFROMPARTS(val,0,0,0,0) 
    FROM [table]; 
+1

Ich würde beachten, dass die 'TIMEFROMPARTS' Funktion ist nur auf SQL 2012 und höher. –

+1

Habe in der Frage keine Informationen zur verwendeten Version gefunden - daher habe ich den besten Fall genommen. ;-) Anyways, wenn nicht 2012, ich denke, es gibt keinen Weg um die Konvertierung nach Varchar. – Tyron78

+1

Nicht zu sagen, du liegst falsch - nur sicherstellen, dass das OP weiß, für welche Versionen es gilt. –

1

select CONVERT(varchar(15),CAST(cast(@val as nvarchar) + ':00:00.0000000' AS TIME),100)

1

Wenn es komplex ist, dann können Sie eine Funktion erstellen.

CREATE FUNCTION dbo.fn_StringHourToAmPm (@timing VARCHAR(250)) 
RETURNS VARCHAR(250) 
AS BEGIN   

    DECLARE @time TIME = CAST(@timing AS TIME) 
    DECLARE @Output NVARCHAR(50) 
    select @Output = CONVERT(VARCHAR(50),@time, 100) 

    RETURN @Output 
END 

Dann

SELECT dbo.fn_StringHourToAmPm('15:02') -- 3:02PM 
2

Versuchen Sie Folgendes:

declare @timing varchar(5)='14' 

declare @time time=cast(case when CHARINDEX(':',@timing)=0 then @timing + ':00' else @timing end as time) 
select convert(varchar(50),@time, 100) 

Oder

Select convert(varchar(50),cast(Cast(val as varchar) + ':00' as time),100) FROM YourTable 
1

Ohne FORMAT zu verwenden, sollten diese auf SQL Server 2008 arbeiten und darüber hinaus:

declare @T table (val int); 

insert into @T values (0),(9),(12),(19); 

select val, 
replace(convert(varchar, CAST(CONCAT(val%24,':00') as time), 109),':00.0000000',' ') as [hour] 
from @T; 

Im Grunde das INT zu einem VARCHAR in dem 109 vordefinierten Format umwandeln und das aufräumen.

oder über Verwendung FORMAT nach dem INT zu einem DATETIME- Transformation:

select val, FORMAT(DATEADD(HH,val%24,0),'h:mm tt') as [hour] from @T; 

Beiden Verfahren kehren:

val hour 
0 12:00 AM 
9 9:00 AM 
12 12:00 PM 
19 7:00 PM 

anzumerken, dass der Modul (val%24) zugegeben. Das ist nur, damit es auch Stunden über 23 funktioniert.

Verwandte Themen