2013-12-08 91 views
2

我在SQL的新手,有一些問題:轉換數據

我如何轉換列(在我的表有超過10000行)在我的SQL表(我使用SQL Server 2008):

  1. 第一列是nvarchar (50)並且包含不同的字符串值,例如像20131211142319,這是一個日期和時間 - 2013/12/11 14:23:19。如何將此值轉換爲日期&時間,並在此列中的所有行上影響此值(超過10 000個)。

  2. 而且我也有列數字,所有這些數字從# + number開始 - 例如, #8339274。如何在所有行中的所有數字之前刪除字符「#」?請注意,該列中的數字長度不同,從5個字符到15個字符。

在此先感謝您。

回答

1

我無法找到的日期時間轉換一個更優雅的解決方案,但在這裏你去:

1. DATETIME轉換

這裏假設你的價值總是在你指定的格式相同:

示例代碼,您可以運行

DECLARE @Value VARCHAR(255) = '20131211142319' 

SELECT CONVERT(DATETIME,LEFT(@Value,8) + SPACE(1) + STUFF(STUFF(STUFF(RIGHT(@Value,6), 1,  0, REPLICATE('0', 0)),3,0,':'),6,0,':')) 

這將字段分爲兩部分,日期部分LEFT(@Value,8),然後是時間 STUFF(STUFF(STUFF(RIGHT(@Value,6), 1, 0, REPLICATE('0', 0)),3,0,':'),6,0,':')。 TIME部分基本上只是在適用的情況下在冒號中添加(參見MSDN上的STUFF),以便返回如下值:

20131211 14:23:19這使其適用於直接轉換爲DATETIME。

2.卸下#從數字

示例代碼,您可以運行

DECLARE @ValueNumber VARCHAR(255) = '#8339274' 

SELECT SUBSTRING(@ValueNumber,2,LEN(@ValueNumber)) 

上面的語句將你的號碼,只能從第二個值返回數據起,不包括#。請參閱MSDN上的SUBSTRING

要在您的表上運行此操作,只需將SELECT語句中的變量名替換爲列名。

實施例使用關於列在上述表中的:

SELECT CONVERT(DATETIME,LEFT([DATECOLUMNNAME],8) + 
SPACE(1) + STUFF(STUFF(STUFF(RIGHT([DATECOLUMNNAME],6), 
1, 0,REPLICATE('0',0)),3,0,':'),6,0,':')) AS [Date], 
SUBSTRING([NUMBERCOLUMNNAME],2,LEN([NUMBERCOLUMNNAME])) AS [Number] 
FROM [TABLENAME] 

替換[DATECOLUMNNAME]與保持你的日期時間值的列的名稱。將[NUMBERCOLUMNNAME]替換爲包含您的號碼的列的名稱。

然後最後用包含這些列的表名替換[TABLENAME]。

+0

很抱歉,但我不明白我怎麼能使用上表中的所有行此解決方案。 – murdoqq

+0

請參閱上述編輯。你想只是執行一個選擇或更新表中的數據?由於列是varchar類型而不是datetime,因此無法使用轉換後的datetime值更新表。 – JBond

0

試試這個:下面的答案也是正確的

declare @a nvarchar(50) 
    set @a='20131211142319' 

    select cast(left(@a,4)+'/'+substring(@a,5,2)+'/'+substring(@a,7,2)+ ' '+ substring(@a,9,2)+':'+substring(@a,11,2)+':' +right(@a,2) as datetime) 

output's this --2013-12-11 14:23:19.000  

    declare @a nvarchar(10) 

    set @a='#1234567' 
    select replace(@a,'#','') 

outputs this--1234567 
+0

對不起,但我不明白如何在表中的所有行上使用此解決方案。 – murdoqq

+0

http://stackoverflow.com/questions/408825/how-to-change-the-data-type-of-a-column-with-query @murdoqq查看鏈接是否有幫助n單擊左鍵接受答案刻度線 –