传递变量时将 datetime 转换为 varchar 不起作用
Posted
技术标签:
【中文标题】传递变量时将 datetime 转换为 varchar 不起作用【英文标题】:Conversion of datetime to varchar not working when passing through variables 【发布时间】:2019-06-01 10:58:55 【问题描述】:我遇到了这个奇怪的问题,我需要将datetime
转换为varchar
。
我运行了这两个查询:
declare @d datetime
set @d ='31/12/2019 16:12:25.317'
select @d
select convert(varchar(50), '31/12/2019 16:12:25.317', 101)
第一个查询抛出错误:
将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。
第二个查询工作正常。
【问题讨论】:
Bad habits to kick : declaring VARCHAR without (length) - 您应该始终为您使用的任何varchar
变量和参数提供长度
我总是在需要的时候使用这种格式:'2019-12-31T16:12:25.317'
。应该工作吗?
【参考方案1】:
如果我猜对了,您正在寻找 103 日期时间格式(英国/法国),即 DD/MM/YYYY。这种情况你可以在下面试试这个-
DECLARE @d DATETIME
SET @d =CONVERT(DATETIME, '31/12/2019 16:12:25.317',103)
SELECT @d
SELECT CONVERT(DATETIME, '31/12/2019 16:12:25.317', 103)
【讨论】:
【参考方案2】:失败发生在第一步,因为@d
被声明为datetime
而不是字符串(除非您的国际化设置允许)。我想你打算:
declare @d varchar(255)
set @d = '31/12/2019 16:12:25.317';
select convert(date, @d, 103)
一般来说,在设置日期时间常量时,你应该使用:
declare @d datetime;
set @d = '2019-12-31T16:12:25.317';
这是 SQL Server 定义日期/时间的与位置无关的方法。警告:虽然这是正确的方法,但我通常会省略 T
以与其他数据库兼容(它仍然始终或几乎始终有效)。
【讨论】:
以上是关于传递变量时将 datetime 转换为 varchar 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
C# 将 DateTime 转换为 Sql Server 2005 格式
在 azure synapse 存储过程中将表名作为参数传递时将查询结果分配给变量