转换整个表SQL的数据

时间:2013-12-08 12:50:16

标签: sql sql-server-2008

我是SQL的新手并且有一些问题:

如何在我的SQL表中转换列(在我的表中超过10 000行)(我使用的是SQL Server 2008):

  1. 第一列是nvarchar (50)并包含不同的字符串值,例如比如20131211142319,它是一个日期和时间 - 2013/12/11 14:23:19。如何将此值转换为日期&时间并对此列中的所有行(超过10 000)产生影响。

  2. 此外,我还有数字列,所有这些数字都来自# + number - 例如#8339274。如何删除字符"#"在所有行中的所有数字之前?请注意,此列中的数字具有不同的长度,从5个字符到15个字符。

  3. 提前谢谢。

2 个答案:

答案 0 :(得分: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,':'))

这会将字段拆分为两个部分,即DATE部分LEFT(@Value,8),然后是TIME 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]。

答案 1 :(得分: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