¿Cómo funciona la function de conversión de SQL al convertir la date y hora para flotar?

por qué la salida de esta consulta:

declare @currentDate as datetime set @currentDate ='01/07/2010' select convert(float, @currentdate) 

… es 40183?

Entonces, para aquellos que se confunden con mi pregunta, mi pregunta es ¿Cómo saber el resultado de la consulta anterior sin ejecutarlo?

DateTime a menudo se representa como un recuento diario de una date pnetworkingeterminada (generalmente conocida como la época) en la parte entera y el porcentaje del día transcurrido desde la mitad de la noche en la parte fraccionaria.

SQL Server no es la exception a esto, por lo que la conversión a Float tiene mucho sentido. El día 0 es el 1 de enero de 1900 00:00:00 (AFAIK, en ninguna zona horaria en particular, por lo que debe considerarlo como "hora local").

Entonces, puedes intentar esto:

 declare @ADate DateTime; set @ADate = '19000101 00:00:00'; select CONVERT(float, @ADate); --should print 0 set @ADate = '19000101 12:00:00'; select CONVERT(float, @ADate); --should print 0.5 set @ADate = '19001231 06:00:00'; select CONVERT(float, @ADate); --should print 364.25 

Entonces, para sus resultados, 40183 días han pasado desde 01/01/1900 00:00:00 y 01/07/2010 00:00:00

Aclaración: los sistemas tipo Unix utilizan un enfoque diferente para almacenar las dates: Segundos desde la época de Unix (1 de enero de 1970 a las 00:00:00 UTC), que es más conocido como time de época.

[Editar] El formatting de date en esta respuesta se cambió al formatting AAAAMMDD en 20140416, después de algunos años de experiencia con SQL Server (y como dijo @Damien en su comentario) este es el único formatting seguro.

Los valores de DateTime se almacenan realmente como dos integers de cuatro bytes debajo del capó. El primer integer de cuatro bytes representa el número de días desde 1900-01-01. El segundo integer de cuatro bytes almacena el número de milisegundos desde la medianoche. Cuando convierte una date y hora en un flotante, la porción decimal representa el porcentaje de los 24 días anteriores. Por lo tanto, 0.5 representa el mediodía.

Básicamente se trata de convertir la datetime y datetime a una date OLE. Hay una descripción decente del process en la documentation de System.DateTime.ToOADate() :

http://msdn.microsoft.com/en-us/library/system.datetime.tooadate.aspx

La explicación rápida es que la parte entera es el número de días desde el 30/12/1899. La parte fraccionaria (cero en este caso) es el time dividido por 24.