2010-10-18 19 views
26

Más por curiosidad que cualquier problema real; la pregunta surgió hoy y sé que he visto que 1899-12-30 se usó como una fecha "predeterminada" y una fecha cero en Access y en las aplicaciones anteriores de SQL Server. Solo me preguntaba por qué, de dónde vino eso, y por qué no se usa 1899-12-31 entonces?¿Por qué 1899-12-30 es la fecha cero en Access/SQL Server en lugar de 12/31?

+1

¿Puede ser más específico? ¿En qué versión de SQL Server? Me gustaría saber –

+0

¿Por qué esta pregunta de nivel de Wikipedia obtiene tantos votos tanto para la pregunta como para la respuesta? No veo cómo pertenece a SO en absoluto. –

+0

Me preguntó, respondí, no tenía idea de que generaría esta respuesta. – birryree

Respuesta

41

Mantener la compatibilidad con Lotus 1-2-3 en el pasado, que tenía un error porque pensaba que el año 1900 era un año bisiesto (¿o fingido?).

La explicación es demasiado larga para citarla, pero en aras de la curiosidad, aquí hay algunos fragmentos.

1900 no fue un año bisiesto.

"¡Es un error en Excel!" Exclamé.

"Bueno, realmente no", dijo Ed. "Tuvimos que hacerlo de esa manera porque necesitamos poder importar hojas de trabajo Lotus 123".

"Entonces, ¿es un error en Lotus 123?"

"Sí, pero probablemente una intencional. Lotus tenía que caber en 640 K. Eso no es mucha memoria. Si ignoras 1900, puedes averiguar si un año determinado es un año bisiesto simplemente buscando si los dos bits de la derecha son cero. Eso es realmente rápido y fácil. Los chicos de Lotus probablemente pensaron que no importaba estar equivocados en esos dos meses en el pasado. Parece que los chicos de Basic querían ser anal en esos dos meses, así que cambiaron la época un día atrás ".

En realidad, este número es mayor que el número real de días. Esto se debe a que Excel se comporta como si existiera la fecha 1900-feb-29. No lo hizo. El año 1900 no fue un año bisiesto (el año 2000 es bisiesto). En Excel, el día después de 1900-Feb-28 es 1900-Feb-29. En realidad, el día después de 1900-Feb-28 fue 1900-Mar-1. Esto no es un error". De hecho, es por diseño. Excel funciona de esta manera porque fue realmente un error en Lotus 123. Cuando se introdujo Excel, 123 tiene casi todo el mercado para el software de hoja de cálculo. Microsoft decidió continuar el error de Lotus, para que sea totalmente compatible. Los usuarios que cambiaron de 123 a Excel no tendrían que realizar ningún cambio en sus datos. Siempre y cuando todas sus fechas sean posteriores al 1900-Mar-1, esto no debería ser motivo de preocupación.

+1

¡Respuesta impresionante y un hecho genial! :) –

+0

* Espero que * no haya sido un error intencionado ... – Andy

+1

@Andy read [Mi primera revisión de BillG - Joel en software] (https://www.joelonsoftware.com/2006/06/16/my-first-billg-review /), era más una optimización, al menos eso parece. – Wolf

0

Según mi leal saber y entender, el tipo de fecha no existía en "SQL Server anterior". Se introdujo en SQL Server 2008 con un valor de fecha cero correspondiente a 0001/01/01.

select cast(0x000000 as date),cast(CONVERT(date, '0001/01/01') as varbinary(max)) 
----------  -------- 
--0001-01-01 0x000000 

Las declaraciones de las preguntas no tienen sentido. Si el tipo de fecha existiera en "Servidor SQL anterior", implicaría la incompatibilidad retroactiva del tipo de fecha en SQL Server 2008.

No tiene sentido responder (y subir las publicaciones) en la pregunta con indefinido o incorrectamente definido condiciones.

+0

Quise decir el tipo de fecha y hora en SQL Server; He visto esa fecha utilizada para establecer los valores predeterminados en el pasado y me pregunté por qué. Eso es todo. –

0

SQL Server parece devolver esta fecha como valor predeterminado si no puede ponerse en contacto con su fuente de tiempo definida.

He tenido esto que suceder durante las incidencias de conmutación por error de clúster cuando mi sistema de asistencia de tiempo biométrico se está ejecutando/en uso.

Para vencer la manipulación local del reloj, alguien entra, le pregunto a la instancia del clúster SQL qué hora es.

No se puede obtener una fuente de tiempo activa válida y devuelve esta fecha.

La solución para mí es simple al buscar esta fecha en mi Sub GetServerTime y usar la hora de la PC local si se devuelve este 'valor predeterminado'.

He visto esto con SQL 2000/2005/2008, todo a través de ADO y VB6.

Cuestiones relacionadas