2009-09-07 8 views
1

SQL Server Management Studio a généré la valeur du type de données "Date" dans la chaîne suivante: CAST (0x38320B00 AS Date).Quelle est la spécification du format de date hexadécimale dans le serveur SQL?

J'ai besoin de le convertir en datetime .NET classique (j'ai la chaîne dans C# app). Je sais que si c'était SQL Server DateTime il serait 2 fois plus long que le nombre hexadécimal et la première partie spécifierait le nombre de jours du 1.1.1900, et la deuxième partie spécifierait le nombre de 1/300ème secondes du midi.

Je pensais que, dans le type de données SQL Server Date, il ne s'agirait que de la première partie de DateTime (partie de temps omise), mais ce n'est pas le cas. Lorsque j'essaie de suivre un extrait, j'obtiens une exception:

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

Alors, qu'est-ce que ce numéro spécifie?

Répondre

3

Le type DATE est stocké en interne comme un nombre entier de 3 octets, ce qui représente le nombre de jours depuis le 1er Janvier 0001.

La valeur hexadécimale que vous avez est au format petit-boutiste, vous aurez donc besoin de retournez-le en big-endian avant de pouvoir l'utiliser en C# DateTime calculs:

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 
Questions connexes