我在数据库中有一些关于 varchar 字段的错误数据。数据包括:
10/2012
May, 2010
August., 2010
05/10/2009
但现在我需要清理这些数据并使用 MM/YYYY 格式更新列。有人有任何建议可以更轻松地做到这一点吗?
我在数据库中有一些关于 varchar 字段的错误数据。数据包括:
10/2012
May, 2010
August., 2010
05/10/2009
但现在我需要清理这些数据并使用 MM/YYYY 格式更新列。有人有任何建议可以更轻松地做到这一点吗?
您可以使用 spt_values 创建月/年转换表来创建您要查找的月和年的组合。
然后通过格式化月/年值来加入它以符合不同的版本。请注意,您只需为 ISDATE(field) <> 1 执行此操作
;With ConversionTable as (
SELECT
months.number month,
years.number year,
right('00' + cast( months.number as varchar(2)), 2)
+ '/' + cast(years.number as char(4)) Final
FROM
master..spt_values months
CROSS JOIN master..spt_values years
WHERE
months.NUMBER between 1 and 12
and months.type = 'P'
AND years.NUMBER between 2000 and 2012
and years.type = 'P')
SELECT t.baddate , ct.final
FROM
TEST t
INNER JOIN
ConversionTable ct
ON t.BadDate =
DateName( month , DateAdd( month , ct.month , 0 ) - 1 )
+ ', '
+ cast(ct.year as char(4))
OR
t.BadDate =
DateName( month , DateAdd( month , ct.month , 0 ) - 1 )
+ '., '
+ cast(ct.year as char(4))
OR
t.BadDate = ct.Final
--- Add more OR statements for your different varieties
WHERE
ISDATE(t.badDate) <> 1
UNION
SELECT
t.BadDate ,
right('00' + cast(MONTH(Cast(t.BadDate as datetime)) as varchar(2)),2) + '/'
+ cast(year(Cast(t.BadDate as datetime)) as varchar(4))
FROM
test t
WHERE
ISDATE(t.badDate) = 1
更新
SELECT badDate,
right(convert(varchar(10),cast(replace(CASE len(badDate) - len(replace(badDate, '/', '')) WHEN 1 THEN substring(badDate,1,2)+'/01/'+right(badDate,4) ELSE badDate END,'.', '') AS datetime),103),7)
FROM test
我建议在代码中执行此操作(不确定有哪些语言可用)。与普通 sql 相比,大多数语言将对日期时间处理和异常处理提供更丰富的支持。
如果您必须支持 SQL Server 2000 和 2005 以及 2008,则尤其如此。