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);
那么这个数字指的是什么?
答案 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