我是SQL的新手并且有一些问题:
如何在我的SQL表中转换列(在我的表中超过10 000行)(我使用的是SQL Server 2008):
第一列是nvarchar (50)
并包含不同的字符串值,例如比如20131211142319
,它是一个日期和时间 - 2013/12/11 14:23:19
。如何将此值转换为日期&时间并对此列中的所有行(超过10 000)产生影响。
此外,我还有数字列,所有这些数字都来自# + number
- 例如#8339274
。如何删除字符"#"在所有行中的所有数字之前?请注意,此列中的数字具有不同的长度,从5个字符到15个字符。
提前谢谢。
答案 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