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