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

标签 sql sql-server tsql date datetime

在 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/yydd/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

关于sql - 如何在 T-SQL 中标准化混合日期格式的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25403082/

相关文章:

java - 更改数据库表时对 JAVA Web 应用程序的提示

sql - 为什么备份 sql server 查询在没有变量的情况下不起作用?

sql - 公共(public)表表达式,为什么要用分号?

sql - 连接两个表时计算不同的计数

mysql - 使用链接 DB 中的另一个 SP 执行 SP

sql - 如何选择处于时间戳之间状态的记录?数据库

sql - 雪花中的 NullIfZero

sql - 如何在SQL中添加动态列?

c# - SqlParameter无法与INSERT语句一起使用

sql-server - sql备用键的主要用途是什么