CAST HEX comme DATATIME – comment get la date?

J'ai un problème avec le traitement d'un vidage de database SQL Server en PHP.

J'ai une colonne appelée datatime avec des valeurs comme:

 0x0000a0af00d7f2eb 

J'ai besoin d'extraire, en PHP, les valeurs date et heure de cette colonne. Je n'ai pas SQL Server disponible, donc je ne peux pas utiliser la solution évidente de CAST(0x0000a0af00d7f2eb AS datetime) .

Quelqu'un m'a dit que cet hex: 0000a0af00d7f2eb est créé par 4 octets de date et 4 octets de time.

Donc je sais que:

Quand je vais changer 0000a0af (les 4 premiers octets) en décimal, je vais get le nombre de jours à partir de 1900. Cela fonctionne très bien.

Mais quand j'essaie de changer les derniers 4 octets (donc il devrait y avoir du time): 00d7f2eb à la décimale je reçois quelque chose que je ne peux pas comprendre. Il devrait s'agir d'un time à partir de minuit en millisecondes et parfois cette valeur est ~ 3 fois inférieure.

Quelqu'un pourrait-il aider à convertir 0000a0af00d7f2eb à ce jour? Je sais que l'heure est entre 5 heures du matin et 23 heures, et le jour est la semaine dernière.

Selon l' article lié dans l'autre question liée à par Rene, SQL Server stocke des intervalles de 3,33 millisecondes dans le deuxième set de 4 octets, pas millisecondes. Donc, si vous calculez en millisecondes, vous obtiendrez en effet un time d'environ 1/3 de ce qu'il devrait être. En utilisant votre exemple, commençons par convertir en décimal

00d7f2eb -> 14152427 3.3ms intervalles

Maintenant multipliez-vous par 3,3 pour convertir en millisecondes, et divisez par 1000 pour get des secondes

14152427 * 3,3 / 1000 ~ 47127,58

Cela représente environ 47 000 secondes après minuit. Diviser par 3600 secondes en une heure

47127,58 / 3600 ~ 13,091

Cela représente donc une durée d'environ 13,1 heures après minuit, ce qui correspond au résultat de la dissortingbution effectuée dans SQL Server.

 select CAST(0x0000a0af00d7f2eb AS datetime) as t 

fonctionne bien pour moi. et il renvoie '16 août 2012 13: 06: 14-0700'.