2

当我运行这个查询时,

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)

它给出了以下错误:

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

但是,如果我通过填充额外的零将 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。

4

1 回答 1

1

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

所以

01d1a33c677c0000 

01 d1 a3 3c 67 7c 00 00
于 2013-10-16T10:04:20.483 回答