如何在 T-SQL 中标准化一列混合日期格式

Bob*_*way 6 sql t-sql sql-server datetime date

在 SQL Server 中有一个表,其中包含一个varchar带有日期数据的列。不幸的是,日期有很多不同的格式。

2012-05-01
27/05/2012 
07MAY2014
19/07/13   
Run Code Online (Sandbox Code Playgroud)

可能还有其他人,但这就是我目前遇到的所有情况。

我需要将它们压缩datetime到另一个表中的一列中,因此我一直试图将它们选择为标准日期时间值。起初,我认为这很容易:

UPDATE myTable 
SET myDateColumn = CONVERT(DATETIME, myDateColumn, 103)
WHERE ISDATE(myDateColumn) = 0
Run Code Online (Sandbox Code Playgroud)

但问题是 SQL Server 将dd/mm/yydd/mm/yyyy视为单独的格式。前者是代码 3,后者是代码 103。所以无论我以哪种方式运行该更新,它都会以相反的格式窒息。

有什么方法可以根据日期格式选择/更新,并将所有这些日期转换为单一有效DateTime格式?

jpw*_*jpw 3

我的猜测是,您只需要尝试区分不同的类并以适当的方式处理每种情况。像这样的东西:

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
Run Code Online (Sandbox Code Playgroud)

输出:

date
----------
2012-05-01
2012-05-27
2014-05-07
2013-07-19
Run Code Online (Sandbox Code Playgroud)

它可能没有那么有效,但我认为这是一次性操作。我没有将其编写为更新语句,但查询应该很容易适应,并且在我看来,如果可能的话,您应该考虑将转换后的日期添加为新的正确日期时间列。

编辑:这是相应的更新语句:

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
Run Code Online (Sandbox Code Playgroud)