2014-01-10 48 views
0

這是很難解釋,但基本上我有時間值的列表作爲VARCHAR格式如下:更新SQL Server中單個列的時間值列表?

enter image description here

我需要轉換這些讓每個變得12:00:00之間的差異該字段中的值只使用UPDATE命令?

你會如何在TSQL中處理這種情況?因爲它是一個VARCHAR,我們沒有日期部分我想我們不能使用任何日期函數?

+2

你需要從'12:00:00 AM'或'12:00:00 PM'的區別?表中的數值代表12小時制還是24小時制? – pete

+0

第一個值應該是1:37:20,如果這有幫助的話,那麼表中的值只會上升到11:59:59。 – Apqu

+1

所以你想(第一個值)'12:00:00 PM - 10:22:40 AM'?其餘的「AM」值是什麼?你是否總是從'12:00 PM'(又名中午)減去? – pete

回答

2

使用CONVERT(datetime,@varchar,14)功能,而不爲日期部分關注VARCHAR和日期之間切換。

SELECT CONVERT(varchar(8), CONVERT(datetime,'12:00:00',14)-CONVERT(datetime,'9:19:4',14) ,14) 
+0

真棒謝謝你,我在我的SET語句中使用了SELECT之後的那個位,它工作完美:-) – Apqu

0

鑑於您指定的12小時限制,以下內容應該可以工作。 您可能需要調整模式的Varchar長度。

t.dt =您的表格和列名稱。

LEFT(CAST(DATEADD(SECOND, DATEDIFF(SECOND, CAST('12:00:00' as time), CAST(t.dt as time))*-1, CAST('00:00:00' as time))as VARCHAR(20)),8) as newtime 

因此,一個潛在的更新將如下所示:

UPDATE t 
SET t.dt = LEFT(CAST(DATEADD(SECOND, DATEDIFF(SECOND, CAST('12:00:00' as time), CAST(t.dt as time))*-1, CAST('00:00:00' as time))as VARCHAR(20)),8) 
2

這裏是有許多工作要做, 1)轉換時間列的實際時間數據類型 2)使用轉換,這可以實現簡單的減法運算。

下面是簡單的代碼(測試):

select 
    convert(time(0), 
     ((convert(datetime, '12:00:00')- convert(datetime, time))), 8) as TimeDiff 
    from 
    times 

這裏是SQLFiddle for this

+0

時間數據類型可用於> = SQL2008 – Anon