列中的多种日期格式

时间:2019-03-21 08:39:11

标签: sql sql-server

我有一个名为日期的列 在本专栏中,我有多种日期格式,如下所示:

  

2017-06-14

     

15年4月9日

列类型为varchar。

我想在日期时间使用以下格式转换此列:

  

yyyy-mm-dd

当我在同一列上使用两种不同的格式时,我不知道该怎么做。

您可以帮忙吗?

4 个答案:

答案 0 :(得分:1)

尝试使用FORMAT(CAST(@yourVarchar AS DATETIME), N'yyyy-MM-dd')功能:

DECLARE @f varchar(50) = '2017-06-14'
SELECT FORMAT(CAST(@f AS DATETIME), N'yyyy-MM-dd')

输出:

2017-06-14

和您的第二种情况:

DECLARE @a varchar(50) = '04/09/15'
SELECT FORMAT(CAST(@a AS DATETIME), N'yyyy-MM-dd')

输出:

2015-04-09

答案 1 :(得分:1)

每种字符串表示格式都可能需要自己的转换日期样式,因此:

with cte as (
select '2017-06-14' DateString
union all
select '04/09/15' -- expected dateformat: dd/mm/yy
)

select 
case when DateString like '%-%-%' then CONVERT(DATE, DateString, 20) -- ODBC canonical
     when DateString like '%/%/%' then CONVERT(DATE, DateString, 3) -- French 
     else null
end
from cte

结果至:

2017-06-14
2015-09-04

答案 2 :(得分:0)

如果所有格式均有效,则简单的投射就可以使用

with cte as(
    select '2017-06-14' as val
    union all
    select '04/09/15' as val
)
select val, cast(val as date) from cte

2015年4月9日将转换为4月9日或9月4日,具体取决于您的数据库语言

答案 3 :(得分:0)

对于大于或等于sql-server的{​​{1}}版本,您可以使用2012

parse()

或者select parse([date] as date using 'en-US') from [your_table] ,它更健壮,

try_parse()