2016-06-22 61 views
0

我需要轉換一個char列,看起來像:SQL-的Transact-改變柱-char爲datetime -103

10/04/2012 
23/01/2006 
20/09/2006 
20/09/2006 

爲datetime。

這個作品,如果我做的:

Select field, convert(datetime, [field], 103) from tablex 

我得到

10/04/2012 2012-04-10 00:00:00.000 
23/01/2006 2006-01-23 00:00:00.000 
20/09/2006 2006-09-20 00:00:00.000 
20/09/2006 2006-09-20 00:00:00.000 

但我需要做的是在ALTER TABLE語句(我不希望創建另一列並刪除前一,它必須是一個方法在一個步驟中要做到這一點):

alter table tablex 
alter column field datetime (103) 

錯誤消息:

列,參數或變量#27:無法在 數據類型datetime上指定列寬。

如何轉換alter table語句內的字段,或者至少不創建另一個字段,然後刪除前一個字段? 謝謝。

+2

您可能希望你的專欄首先更新到明確的日期格式。 'UPDATE dbo.YourTable SET YourColumn = CONVERT(VARCHAR(8),CONVERT(DATETIME,YourColumn,103),112)'。然後你可以直接使用你的alter table:'ALTER TABLE ... ALTER COLUMN YourColumn DATETIME' – Lamak

+1

@a_horse_with_no_name示例代碼使它看起來像SQL Server – Lamak

回答

-1

我會做的是將列中的數據先轉換爲美國格式。然後,您可以將列更改爲日期時間,而無需指定格式。

下面是一個使用臨時表的例子:

CREATE TABLE #t (col1 VARCHAR(50)) 

INSERT INTO #t (col1) VALUES ('10/04/2012') 
INSERT INTO #t (col1) VALUES ('23/01/2006') 
INSERT INTO #t (col1) VALUES ('20/09/2006') 
INSERT INTO #t (col1) VALUES ('20/09/2006') 

UPDATE #t SET col1 = CONVERT(VARCHAR, CONVERT(DATETIME, col1, 103)) 

ALTER TABLE #t ALTER COLUMN col1 DATETIME 

SELECT col1 FROM #t 

DROP TABLE #t 
+0

「首先將列中的數據轉換爲US格式」 - 它會從它已經存在的問題中出現。而且,在不知道用戶使用哪些設置的情況下,無法保證SQL Server無論如何都將毫無疑問地從美國格式轉換。充其量,它*可能*工作。它中間,你會得到一個錯誤。在最壞的情況下(全天值<= 12)它會擾亂日期和月份。 –

+0

@Damien_The_Unbeliever正是,這就是爲什麼我發表評論說,它應該首先將其轉換爲明確的格式。 – Lamak

+0

問題顯示「23/01/2006」顯然不是美國格式。如果您有混合格式,則無法知道要將哪種格式轉換爲例如4/12/2006可能不止一種格式。 – Avitus