Sql 列上的多个日期格式
我有一个名为“日期”的专栏 在本专栏中,我有如下多种日期格式: 2017-06-14 2015年9月4日 列类型为varchar 我想使用以下格式在datetime上转换此列: 年月日 当我在同一列上有两种不同的格式时,我不知道怎么做 您能帮忙吗?尝试使用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
格式(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日(或其他示例),则您的数据已失去所有意义,并且(实际上)变得毫无价值。