Sql 列上的多个日期格式

Sql 列上的多个日期格式,sql,sql-server,Sql,Sql Server,我有一个名为“日期”的专栏 在本专栏中,我有如下多种日期格式: 2017-06-14 2015年9月4日 列类型为varchar 我想使用以下格式在datetime上转换此列: 年月日 当我在同一列上有两种不同的格式时,我不知道怎么做 您能帮忙吗?尝试使用格式(CAST(@yourVarchar AS DATETIME),N'yyyy-MM-dd')函数: DECLARE @f varchar(50) = '2017-06-14' SELECT FORMAT(CAST(@f AS DATETIM

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

2017-06-14

2015年9月4日

列类型为varchar

我想使用以下格式在datetime上转换此列:

年月日

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

您能帮忙吗?

尝试使用
格式(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
2015-04-09
第二种情况是:

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

2017-06-14
2015-04-09

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

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

如果它们都有有效的格式,简单的cast就可以了

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

对于大于或等于
2012
sql server
版本,根据您的数据库语言,2015年4月9日或9月4日将被转换为4月9日或9月4日。您可以使用
parse()

或者
试试更健壮的parse()

select try_parse([date] as date using 'en-US') from [your_table]

2015年9月4日,是2015年4月9日,还是2015年9月4日,还是2004年9月15日,还是1904年?最好使用适当的数据类型创建一个新列,并删除旧列。在update语句中,您可以检查字符串的长度,然后应用适当的转换(
当len(strdate)=8时,则…否则…结束
)。如果您的意思是这样的多日期格式:
yyy-mm-dd
&
mm/dd/yy
。也可以在同一列中找到其他格式,如
dd/mm/yy
?或者只有两种不同的格式……这里真正的问题是您没有使用
日期
数据类型来存储日期
varchar
不是一刀切的数据类型。至于@Jarlh所说的,他在这里是正确的。如果您不知道
'04/09/15'
是9月4日还是4月9日(或其他示例),则您的数据已失去所有意义,并且(实际上)变得毫无价值。