Sql 将varchar转换为日期ddmmyyyy时出错
我有一个Sql 将varchar转换为日期ddmmyyyy时出错,sql,sql-server,string,tsql,date,Sql,Sql Server,String,Tsql,Date,我有一个varchar列,格式为ddmmyyyy,我正在尝试将其转换为dd-mm-yyy格式的日期。我正在使用下面的查询,但得到错误: 从字符串转换日期和/或时间时,转换失败 要将字符串转换为日期,只需[尝试]cast()它;SQL Server通常具有足够的灵活性,可以自行确定格式: try_cast(newdate as date) 如果要将其转换回目标格式的字符串,则可以使用format(): 与纯字符串操作相比,try_cast()/format()方法的优点在于,它可以验证该字符串是
varchar
列,格式为ddmmyyyy,我正在尝试将其转换为dd-mm-yyy格式的日期。我正在使用下面的查询,但得到错误:
从字符串转换日期和/或时间时,转换失败
要将字符串转换为日期,只需
[尝试]cast()
它;SQL Server通常具有足够的灵活性,可以自行确定格式:
try_cast(newdate as date)
如果要将其转换回目标格式的字符串,则可以使用format()
:
与纯字符串操作相比,
try_cast()
/format()
方法的优点在于,它可以验证该字符串是否是过程中的有效日期。如果没有日期,就有字符串。因此,您可以使用字符串操作:
select stuff(stuff(newdate, 5, 0, '-'), 3, 0, '-')
如果要转换为日期,可以执行以下操作:
select convert(date, concat(right(newdate, 4), substring(newdate, 3, 2), left(newdate, 2)))
然后,您可以根据需要格式化此文件
但是,不应将值转换为日期。您首先应该将其存储为日期。必须与其他人达成一致。首先,为什么要将日期存储为字符串?非标准格式,不少于?这里有一种方法,但您确实应该修复数据模型。将日期存储为日期
DECLARE @badIdea table (dt char(8));
INSERT @badIdea(dt) VALUES('21052020');
SELECT newdate = TRY_CONVERT(date, RIGHT(dt,4) + SUBSTRING(dt,3,2) + LEFT(dt,2))
FROM @badIdea;
BTW 105无法工作,因为它需要破折号。这项工作:
SELECT CONVERT(date, '21-05-2020', 105);
这也是一个糟糕的格式,因为谁知道07-08-2020是7月8日还是8月7日。但至少SQL Server支持这一点。您当前的选择并非如此。SQL不会以不同的格式存储日期数据类型,因此尝试并调整这种格式可能不是一个好主意 但是,如果您希望结果集仅以不同的格式显示日期,那么您的做法是正确的。您只需要将日期数据类型转换为字符串
SELECT *
, COALESCE ( TRY_CONVERT ( CHAR(10), newdate, 105 ), CONVERT ( CHAR(10), newdate ) )
FROM mydate
日期在SQL Server中没有格式,它们存储在内部表示形式中。
SELECT CONVERT(date, '21-05-2020', 105);
SELECT *
, COALESCE ( TRY_CONVERT ( CHAR(10), newdate, 105 ), CONVERT ( CHAR(10), newdate ) )
FROM mydate