2011-10-04 79 views
1

我在SQL Server 2008中有一個表,它將日期/時間值存儲爲varchar(max)(不問)。我的任務是將這些值從PST轉換爲GMT。該值在兩種格式各行中的一個:如何將不同的字符串轉換爲日期時間

2009年3月12日下午4:00

OR

2009年3月12日下午4點零零分00秒

我如何使用T-SQL,確定日期的格式(我想可能檢查它是否以字符或數字值開頭),然後將其轉換爲SQL日期時間變量,以便我可以使用DATEADD爲其添加小時?

我已經編寫了T-SQL來創建遊標並遍歷行,我只是不確定如何檢測它的格式,然後轉換爲DATETIME。我敢肯定可能會破解它,但我認爲這裏的人可以爲我提供一個正確的方法來做到這一點。

+0

您個人是否確信他們肯定會採用其中一種或其他格式,或者是否需要檢查? –

+0

我相信它是其中一種格式。這是我們正在運行的一次性數據更新,並且查看了所有數據。沒有其他格式,除了這兩個。 – Scott

回答

2

可以使用convert功能,這將對於這兩種方案

SELECT convert(datetime, '3/12/2009 4:00:00PM') -- 2009-03-12 16:00:00.000 

SELECT convert(datetime, 'Mar 12 2009 4:00PM') -- 2009-03-12 16:00:00.000 

那麼,只要你喜歡

+0

這是進行轉換的最佳方式。至於如何更新行,您提到使用遊標來遍歷它們。它會更快(可以說更像「類似SQL」),而不是使用「UPDATE」語句。假設你在'old'列中有字符串,並且想要將真正的'datetime'值放在一個名爲'new'的列中,你可以'UPDATE yourtable SET new = convert(datetime,old)'。 –

+0

@Massimiliano你的解決方案適用於任何月份和日期小於或等於12的任何日期。然而,如果我寫'SELECT convert(datetime,'13/12/2009 4:00: 00PM')',它會給出一個超出範圍的錯誤值,但對於'SELECT convert(datetime,'12/13/2009 4:00:00 PM')''可以正常運行。那麼如何解決這個問題呢? –

0

這工作正常,我可以格式化它的工作,沒有循環或遊標要求:

DECLARE @Date varchar(MAX) 

SET @Date = 'Mar 12 2009 4:00PM' 

SELECT DATEADD(hh,8,CONVERT(DATETIME,@date)) 

SET @Date ='3/12/2009 4:00:00PM' 

SELECT DATEADD(hh,8,CONVERT(DATETIME,@date)) 
相關問題