将 nvarchar 变量转换为十六进制,然后再转换为日期时间:当 nvarchar 的长度小于正好 18 个字符时出错



当我运行此查询时,

declare @var nvarchar(448) = '0x1d1a33c677c0000';
select CAST(DATEADD(mi, (CAST(CONVERT(varbinary(max),@var, 1) as bigint) / 600000000), CAST('1/1/1601' AS DATETIME2)) as DATETIME2)

它给出以下错误:

Msg 8114,级别 16,状态 5,第 2
行将数据类型 nvarchar 转换为变量时出错。

但是,如果我通过填充额外的零将 nvarchar 更改为 18 个字符长的字符串,则查询工作正常。

样本:

declare @var nvarchar(448) = '0x01d1a33c677c0000';
select CAST(DATEADD(mi, (CAST(CONVERT(varbinary(max),@var, 1) as bigint) / 600000000), CAST('1/1/1601' AS DATETIME2)) as DATETIME2)

结果:

2016-05-01 00:00:00.0000000

虽然我通过使用 STUFF 语句绕过了这一点。但我想了解这种行为吗?

我正在使用 SQL Server 2008。

二进制字符串由表示字节的十六进制字符对组成,因此如果您有奇数个字符,则剩余一个字符。

所以

01d1a33c677c0000 

01 d1 a3 3c 67 7c 00 00

最新更新