转换为MM / YYYY格式

时间:2012-10-16 19:09:43

标签: sql sql-server-2008 tsql date datetime

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

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

但现在我需要清理这些数据&使用MM / YYYY格式更新列。任何人都有这方面的建议吗?

3 个答案:

答案 0 :(得分:3)

您可以使用spt_values创建月/年转换表,以创建您正在寻找的月份和年份的组合。

然后通过格式化月/年值来加入它以符合不同的版本。请注意,您只需要在ISDATE(字段)<>的位置执行此操作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

DEMO

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

Demo

答案 2 :(得分:0)

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

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