2016-07-12 82 views
1

我有一個table小時values。我需要的小時值轉換爲AM/PM格式,如下所示:在SQL Server中將整數值轉換爲小時值(AM/PM)

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

我已經試過這樣的邏輯:

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

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

但是這需要val被轉換成varchar。 SQL Server中是否有其他方式或內置函數可用於執行此操作?

+1

「* convert *」是什麼意思?在查詢輸出中替換數據庫或格式? –

+2

你正在使用哪個版本的sql server? – Sankar

+0

@ PM77-1是輸出需要AM/PM格式 – bmsqldev

回答

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

'格式'只適用於SQL Server 2012及更高版本。 – Sankar

2

嘗試以下操作:

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

我會注意到'TIMEFROMPARTS'函數只在SQL 2012及更高版本上可用。 –

+1

在問題中沒有找到任何有關使用版本的信息 - 因此我採取了最好的情況。 ;-)無論如何,如果不在2012年,我想沒有辦法繞過轉換爲varchar。 – Tyron78

+1

不要說你錯了 - 只要確保OP知道它適用於什麼版本。 –

1

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

1

如果是複雜的,那麼你可以創建一個函數。

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 

然後

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

嘗試以下操作:

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) 

或者

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

不使用FORMAT,這應該SQL Server 2008上及以後的工作:

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; 

基本上,將INT轉換爲109預定義格式的VARCHAR並將其清理乾淨。

或通過改造INT到DATETIME後使用格式:

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

兩種方法將返回:

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

注意是否添加了模量(val%24)。這只是爲了使它也能在23小時以上工作。