2013-02-07 156 views
1

我有一個表格,其中有一列以m/d/yyyy格式存儲的日期列nvarchar(50)數據類型(我繼承了這個...)。我想將這些列轉換爲日期數據類型,以便它們被正確存儲,但不能意外地將數據放在列中。將nvarchar轉換爲日期列

我已經嘗試過在SQL Server 2008R2中使用設計器來更改數據類型的日期。這適用於我的測試專欄(保留日期,更正格式等),但所有空值都成爲1900-01-01。我可以忍受這一點,但似乎有一個更有說服力的解決方案。

然而,當我試圖在真實的數據列,我收到了一個錯誤:

Unable to modify table. Conversion failed when converting date and/or time from character string.

什麼是處理這個正確的方法是什麼?對不起,如果這是重複的。我一直在尋找一個小時,但還沒有弄明白。

回答

3

您顯然在表中有某處SQL Server無法將其轉換爲日期的數據。您可以沿着這些行查詢行:

SELECT * FROM TableName WHERE ISDATE(ColumnName) != 1 

顯然,您需要用實際名稱替換TableName和ColumnName。

一旦您確定了具有錯誤數據的行,處理該行取決於您...爲每行手動更改數據,將它們設置爲null,無論您認爲在這種情況下是否可接受。

+0

這工作。我跑了一個查詢,顯示了非日期和一些0出現了一些空值。然後,我運行另一個查詢來更新表格,將所有非日期替換爲NULL,然後再次嘗試。普雷斯托!謝謝! – Tracy

+0

我已經解決了如何處理,看看我的答案。這對你也有幫助。 – Kaf

0

我建議你用Date數據類型添加一個新列,然後轉換/複製數據並最終刪除原始列。

0

你可以做的是

  1. 鑄造現有的列值DATETIME

  2. DATETIME

  3. 更新新的列值添加其他列類型的表中刪除現有的列

0

也許你可以在時間上覆制數據類型爲date的列,利用它你可以運行update命令將varchar轉換爲datetime並將其存儲在新列中,當你確定所有的信息都是正確的,您可以刪除列並將新列重命名爲原始名稱。

當我需要確保不會丟失更改數據類型的信息時,我總是這樣做。

0

您可以使用以下查詢將您的日期更新爲ISO Format (yyyymmdd),這將保證可以在任何服務器上工作。SQL SERVER - DEMO涵蓋你的約會像'd/m/yyyy''dd/m/yyyy'的4種可能的情況下,'d/mm/yyyy' & 'dd/mm/yyyy'並更新到ISO Format

Update mytable 
Set d = right(d,charindex('/',reverse(d),1)-1) + 
      right('0' + substring(d, charindex('/',d,1) + 1, charindex('/', d, charindex('/',d,1) + 1) - charindex('/',d,1) -1),2) + 
      right('0' + left(d,charindex('/',d,1)-1),2) 

或者您可以直接在SELECT查詢中使用此方法,因爲

Select id,convert(date, 
      right(d,charindex('/',reverse(d),1)-1) + 
      right('0' + substring(d, charindex('/',d,1) + 1, charindex('/', d, 
         charindex('/',d,1) + 1) - charindex('/',d,1) -1),2) + 
      right('0' + left(d,charindex('/',d,1)-1),2) 
      ) correctDate 
From mytable