0

我在数据库中有一些关于 varchar 字段的错误数据。数据包括:

10/2012
May, 2010
August., 2010
05/10/2009

但现在我需要清理这些数据并使用 MM/YYYY 格式更新列。有人有任何建议可以更轻松地做到这一点吗?

4

3 回答 3

3

您可以使用 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

演示

于 2012-10-16T19:46:17.560 回答
2

更新

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

演示

于 2012-10-16T19:35:33.403 回答
0

我建议在代码中执行此操作(不确定有哪些语言可用)。与普通 sql 相比,大多数语言将对日期时间处理和异常处理提供更丰富的支持。

如果您必须支持 SQL Server 2000 和 2005 以及 2008,则尤其如此。

于 2012-10-16T19:26:39.953 回答