我在一个字段中有几种不同格式的日期。它看起来像这样。
20200228
12/15/2021
7/6/2020
Oct 29 2017 12:00AM
Oct 31 20
08/01/18
如何将所有标准化为MM / DD / YYYY?
20200228 --> 02/28/2020
12/15/2021 --> no change
Oct 31 2017 12:00AM --> 10/31/2017
Oct 31 20 --> 10/31/2017
08/01/18 --> 08/01/2018
我尝试过各种Cast和Convert组合,但我无法获得任何工作。那里有人有解决方案吗?它不必是一次查询中的一次传递。我确信它可以在几次迭代中完成,但我不知道如何解决它。
答案 0 :(得分:2)
就个人而言,我使用带有IsDate的CASE语句(自2008年起可用)创建一个持久计算列:
ALTER TABLE dbo.YourTable
ADD YourDate_DateTime AS CASE WHEN ISDATE(YourDate) = 1 THEN CAST(YourDate AS DATETIME) ELSE NULL END PERSISTED
GO
这样你就不需要每次都经常进行计算。 SQL没有被识别为日期的任何内容都将为NULL,但实际上没有办法弥补每个这样的值。至少通过这种方式,您可以轻松搜索NULL值以进行修复。
答案 1 :(得分:1)
基本上,您只需尝试一次又一次转换 - 但转换为date
而不是其他格式。这是一个想法:
select coalesce(try_convert(date, col),
try_convert(date, col, 100),
try_convert(date, col, 101),
try_convert(date, col, 102),
try_convert(date, col, 107)
)
我不确定这是否涵盖了您的所有格式,但值得一试。
编辑:
SQL Server在阅读日期方面非常灵活。默认设置似乎适用于您的示例:
with d as (
select '20200228' as col union all
select '12/15/2021' union all
select '7/6/2020' union all
select 'Oct 29 2017 12:00AM' union all
select 'Oct 31 20' union all
select '08/01/18'
)
select cast(d.col as date)
from d;
SQL Fiddle正在使用SQL Server 2014.我不认为对日期转换的处理已经改变(尽管可能有)。
答案 2 :(得分:1)
试试这个,它会对你有帮助 -
更新myTable SET myDateColumn = CONVERT(DATETIME,myDateColumn,103) WHERE ISDATE(myDateColumn)= 0