Bob*_*way 6 sql t-sql sql-server datetime date
在 SQL Server 中有一个表,其中包含一个varchar带有日期数据的列。不幸的是,日期有很多不同的格式。
2012-05-01
27/05/2012 
07MAY2014
19/07/13   
可能还有其他人,但这就是我目前遇到的所有情况。
我需要将它们压缩datetime到另一个表中的一列中,因此我一直试图将它们选择为标准日期时间值。起初,我认为这很容易:
UPDATE myTable 
SET myDateColumn = CONVERT(DATETIME, myDateColumn, 103)
WHERE ISDATE(myDateColumn) = 0
但问题是 SQL Server 将dd/mm/yy和dd/mm/yyyy视为单独的格式。前者是代码 3,后者是代码 103。所以无论我以哪种方式运行该更新,它都会以相反的格式窒息。
有什么方法可以根据日期格式选择/更新,并将所有这些日期转换为单一有效DateTime格式?
我的猜测是,您只需要尝试区分不同的类并以适当的方式处理每种情况。像这样的东西:
declare @tab table (d varchar(20))
insert @tab values ('2012-05-01'),('27/05/2012'),('07MAY2014'),('19/07/13')
select 
    case 
        when isnumeric(left(d,4)) = 1 then cast(d as date) 
        when len(d) = 10 then convert(date, d, 103) 
        when len(d) = 8 then convert(date, d, 3) 
        when charindex('/',d) = 0 and isnumeric(d) = 0 then convert(date, d, 106) 
    end as [date]
from @tab
输出:
date
----------
2012-05-01
2012-05-27
2014-05-07
2013-07-19
它可能没有那么有效,但我认为这是一次性操作。我没有将其编写为更新语句,但查询应该很容易适应,并且在我看来,如果可能的话,您应该考虑将转换后的日期添加为新的正确日期时间列。
编辑:这是相应的更新语句:
update @tab
set d = 
    case 
        when isnumeric(left(d,4)) = 1 then cast(d as date) 
        when len(d) = 10 then convert(date, d, 103) 
        when len(d) = 8 then convert(date, d, 3) 
        when charindex('/',d) = 0 and isnumeric(d) = 0 then convert(date, d, 106) 
    end 
from @tab