2013-07-26 202 views
1

我有日期和時間的這樣一列:將varchar轉換爲datetime的SQL Server 2008

20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:43 
    20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:41 
    20/Mar/2013:02:28:46 

此列的數據類型設置爲「VARCHAR」。我只需要按照以下格式轉換列到:

20/03/2013:02:28:47 
    20/03/2013:02:28:43 
    20/03/2013:02:28:47 
    20/03/2013:02:28:47 
    20/03/2013:02:28:47 
    20/03/2013:02:28:47 
    20/03/2013:02:28:41 
    20/03/2013:02:28:46 

也可以我改變它的數據類型從varchar到SQL日期和時間數據類型! 我與我的查詢喜歡嘗試:

SELECT convert(mydatetimecolumn,105) from mytable 

,但它給了我喜歡的結果:

1900-04-16 00:00:00.000 
    1900-04-16 00:00:00.000 
    1900-04-16 00:00:00.000 
    1900-04-16 00:00:00.000 
    1900-04-16 00:00:00.000 

我怎樣才能解決這個問題?有人可以幫我嗎?提前致謝!

+7

你爲什麼要在一個字符串列中存儲日期時間值?你也可以展示一下3月4日的樣子嗎?它是否具有領先的0或不是? –

+0

其實我是從Excel文件導入數據,所以 – user2496503

+3

好吧,那麼爲什麼你的Excel文件有這樣可怕的格式? –

回答

4

這是一個可能的解決方案,假設您沒有任何垃圾在這個列中無法正確轉換(這是完全可能的,因爲某些原因,您決定將日期存儲爲字符串)。

請注意,這是一個樣本而不是你可以直接應用到你現有的表。這是有意的。它是在tempdb中有意創建的,並且有虛構/無意義的表名,所以您可以嘗試一下,而不是直接針對您的生產表嘗試任何操作。因爲,如果您針對真實表格運行更新會發生什麼情況,並且它不像您期望的那樣工作?你有備份嗎?

USE tempdb; 
GO 

CREATE TABLE dbo.floob(splunge VARCHAR(32)); 

INSERT dbo.floob(splunge) VALUES('20/Mar/2013:02:28:47'),('4/Mar/2013:02:25:32'); 

UPDATE dbo.floob SET splunge = CONVERT(CHAR(8), 
    CONVERT(DATETIME, REPLACE(LEFT(splunge, 
    CHARINDEX(':', splunge)-1), '/', ' '), 13), 112) 
    + ' ' + RIGHT(splunge, 8); 

SELECT splunge FROM floob; 
GO 

SELECT CONVERT(DATETIME, splunge) FROM floob; 
GO 

ALTER TABLE dbo.floob ALTER COLUMN splunge DATETIME; 
GO 

SELECT splunge FROM floob; 
GO 

爲了您的真正的表,再假設有表中沒有垃圾,你只需做UPDATEALTER部分(您的真實表和列名的場推杆的floobsplunge代替)。

SQLfiddle example

+0

我不需要創建一個新表! :( – user2496503

+4

@ user2496503我知道這是一個* sample *,你可以自己嘗試一下,並確保它可以正常工作,然後再對你的* real *表進行操作,但是你沒有給我們真正的表或列無論如何,所以我不知道你爲什麼會期望一個解決方案,可以對付你的對象。 –

0

的一種方式;

declare @s varchar(32) = '20/Mar/2013:02:28:46' 

select cast(stuff(replace(@s, '/', ' '), 12, 1, ' ') as datetime) 

(No column name) 
2013-03-20 02:28:46.000 

使用

cast(stuff(replace(@s, '/', ' '), len(@s) - 8, 1, ' ') as datetime) 

如果這一天是ddd

相關問題