传递变量时将 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 存储过程中将表名作为参数传递时将查询结果分配给变量

如何在与 webpack 捆绑时将 SASS 变量转换为原生 CSS 变量?

在导入时将 Swagger 参数名称转换为 Postman 变量