在C#中将varbinary转换为DateTime

时间:2013-01-18 01:42:32

标签: c# datetime type-conversion varbinary

我在SQL Server表中有一个datetime列。我们需要加密它。所以,我将它转换为SSMS中的varbinary。我只是编辑了表,将datetime类型设置为varbinary并让SQL Server转换它。之后,我编写了一次性的C#代码来解决它,加密它(使用我们中间层的加密算法)并将其推回到数据库中。对于名称和其他字符串类型的某些nvarchars也是如此。

当我拔出加密数据(使用NHibernate)时,我将varbinary拉入byte []并解密。然后我尝试将其转换回原始值。

nvarchar-as-varbinary列转换精细;例如,我得到了可能的名字。

return Encoding.Unicode.GetString(source.FirstName);

但是,我很难将日期转换回原始形式。我正在使用:

long ticks = BitConverter.ToInt64(source.DateOfBirth, 0);
return new DateTime?(new DateTime(1980, 1, 1).AddMilliseconds(ticks));

这似乎没有正确返回日期。将其强制转换为DateTime的正确方法是什么?

更新:请求了样本值。最初为1/1/1901的日期时间,当解密时,产生一个byte [],其中byte [2] = 1,byte [3] = 109,其他所有为0.另一个datetime'1941-04-26'产生解密后,byte [2] = 58,byte [3] = 242。

3 个答案:

答案 0 :(得分:1)

日期存储为自1900-01-01以来的天数。

示例:

byte[] data = {0,0,58,242};

if (BitConverter.IsLittleEndian) {
  Array.Reverse(data);
}
int days = BitConverter.ToInt32(data, 0);
DateTime date = new DateTime(1900, 1, 1).AddDays(days);

Console.WriteLine(date);

输出:

1941-04-26 00:00:00

答案 1 :(得分:0)

Int64 ticks = BitConverter.ToInt64(source.DateOfBirth, 0);
DateTime dt = DateTime.FromBinary(ticks);

答案 2 :(得分:0)

解密varbinary数据后,你能获得字符串值并通过SSMS运行吗?类似的东西:

SELECT CONVERT(datetime, 0x0000A149016D7FD9)

您的varbinary数据在SQL Server中是什么样的?我怀疑翻译中有些东西搞砸了。

祝你好运。