SQL Server中十六进制日期格式的规范是什么?

时间:2009-09-07 11:58:53

标签: c# .net sql-server-2008 hex

SQL Server Management studio将数据类型“Date”的值生成为以下字符串: CAST(0x38320B00 AS日期)。

我需要将它转换为经典的.NET日期时间(我在c#app中有字符串)。我知道如果它是SQL Server DateTime,它将是Hex号码的2倍,第一部分将指定从1.1.1900开始的天数,第二部分将指定从中午开始的1/300秒的数量。

我认为分别在SQL Server Date数据类型中,这只是DateTime的第一部分(省略了时间部分),但事实并非如此。当我尝试关注片段时,我得到例外:

Int32 high = Int32.Parse("38320B00", NumberStyles.HexNumber);
DateTime start = new DateTime(1900, 1, 1);
start = start.AddDays(high);

那么这个数字指的是什么?

1 个答案:

答案 0 :(得分:3)

DATE类型在内部存储为3字节整数,表示自0001年1月1日以来的天数。

您拥有的十六进制值采用小端格式,因此您需要先将其翻转为big-endian,然后才能在C#DateTime计算中使用它:

string hexString = "38320B00";

// convert the first 6 characters to bytes and combine them into an int
// we can ignore the final two characters because the DATE type is a
// 3-byte integer - the most-significant-byte should always be zero
int days = byte.Parse(hexString.Substring(0, 2), NumberStyles.HexNumber)
    | byte.Parse(hexString.Substring(2, 2), NumberStyles.HexNumber) << 8
    | byte.Parse(hexString.Substring(4, 2), NumberStyles.HexNumber) << 16;

DateTime dt = new DateTime(1, 1, 1).AddDays(days);

Console.WriteLine(dt);    // 12/12/2009 00:00:00