如何将日期从几种格式转换为一种格式?

时间:2017-11-15 22:34:21

标签: sql sql-server sql-server-2008

我在一个字段中有几种不同格式的日期。它看起来像这样。

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组合,但我无法获得任何工作。那里有人有解决方案吗?它不必是一次查询中的一次传递。我确信它可以在几次迭代中完成,但我不知道如何解决它。

3 个答案:

答案 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