¿Por qué 1899-12-30 es la fecha cero en Access / SQL Server en lugar de 12/31?

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?

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

La explicación es demasiado larga para citarla, pero por curiosidad, aquí hay algunos fragmentos.

1900 no fue un año bisiesto.

“¡Es un error en Excel!” Exclamé.

“Bueno, en realidad 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 uno 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 más a la derecha son cero. Eso es realmente rápido y fácil. Los chicos de Lotus probablemente pensaron que no tenía nada de malo estar en esos dos meses en el pasado. Parece que los chicos de Basic querían ser anal durante esos dos meses, así que se mudaron época un día de vuelta “.

En realidad, este número es uno 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.

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 preguntas no tienen sentido. Si el tipo de fecha existiera en “SQL Server anterior”, implicaría la compatibilidad retroactiva del tipo de fecha en SQL Server 2008.

No tiene sentido responder (y subir las publicaciones) en la pregunta con términos indefinidos o definidos incorrectamente.

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

He tenido esto que suceder durante los incidentes de conmutación por error de clúster cuando mi sistema de asistencia biométrica de tiempo 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 puede obtener una fuente de tiempo activa válida y devuelve esta fecha.

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

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