2010-10-18 13 views
26

Più per curiosità di qualsiasi problema reale; la domanda è venuta oggi e so che ho visto 1899-12-30 usato come data "predefinita" e una data zero in Access e le vecchie applicazioni di SQL Server. Mi sono chiesto perché - da dove viene, e perché non viene usato il 1899-12-31?Perché la data zero è 1899-12-30 in Access/SQL Server anziché 12/31?

+1

Puoi essere più specifico - in quale versione di SQL Server? Mi piacerebbe sapere –

+0

Perché questa domanda a livello di Wikipedia ottiene così tanti voti sia per la domanda che per la risposta? Non vedo affatto come faccia a SO. –

+0

Ha chiesto, ho risposto, non avevo idea che avrebbe generato questa risposta. – birryree

risposta

41

Mantenimento della compatibilità con Lotus 1-2-3 nel corso della giornata, che presentava un bug in quanto pensava che l'anno 1900 fosse un anno bisestile (o fatto finta?).

La spiegazione è troppo lunga per essere citata, ma per motivi di curiosità, ecco alcuni frammenti.

1900 non è stato un anno bisestile.

"È un bug in Excel!" Ho esclamato

"Beh, non proprio," disse Ed. "Dovevamo fare così perché abbiamo bisogno di poter importare fogli di lavoro Lotus 123".

"Quindi, è un errore in Lotus 123?"

"Sì, ma probabilmente un uno intenzionale. Lotus ha dovuto adattarsi in 640K. Questo non è un sacco di memoria. Se si ignora 1900, si può capire se un determinato anno è un anno bisestile solo, cercando di vedere se i due bit più a destra sono zero .Questo è molto semplice e veloce.I tipi di Lotus probabilmente pensavano che non fosse importante essere sbagliati per quei due mesi in passato.Piace che i ragazzi di base volevano essere anonimi per quei due mesi, così hanno spostato l'epoca un giorno indietro. "

realtà, questo numero è uno maggiore del numero effettivo di giorni. Questo perché Excel si comporta come se esistesse la data 1900-Feb-29. Io non l'ho fatto. L'anno 1900 non fu un anno bisestile (l'anno 2000 è un anno bisestile). In Excel, il giorno dopo il 1900-Feb-28 è 1900-Feb-29. In realtà, il giorno dopo il 1900-Feb-28 era il 1900-Mar-1. Questo non è un "bug". In effetti, è di design. Excel funziona in questo modo perché era veramente un bug in Lotus 123. Quando è stato introdotto Excel, 123 ha quasi l'intero mercato del software per fogli di calcolo. Microsoft ha deciso di continuare il bug di Lotus, in modo da renderlo pienamente compatibile. Gli utenti che passavano da 123 a Excel non avrebbero dovuto apportare alcuna modifica ai propri dati. Finché tutte le date successive al 1900-Mar-1, questo dovrebbe essere di alcuna preoccupazione.

+1

Risposta eccezionale e un fatto interessante! :) –

+0

* Spero sicuramente * che in realtà non fosse un bug intenzionale ... – Andy

+1

@Andy leggi [My First BillG Review - Joel on Software] (https://www.joelonsoftware.com/2006/06/16/my-first-billg-review /), era più un'ottimizzazione, almeno sembra così. – Wolf

0

Per quanto ne so, il tipo di data non esisteva in "SQL Server precedente". È stato introdotto in SQL Server 2008 con valore di data zero corrispondente a 0001/01/01.

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

Le dichiarazioni di domande non hanno senso. Se il tipo di data esisteva in "SQL Server precedente", avrebbe implicato la compatibilità all'indietro del tipo di data in SQL Server 2008.

Non c'è alcun punto nel rispondere (e post upvote) nella domanda con undefined o in modo errato definito termini.

+0

Intendevo il tipo datetime in SQL Server; Ho visto quella data utilizzata per impostare i valori predefiniti in passato e mi chiedevo perché. È tutto. –

0

SQL Server sembra restituire questa data come predefinita se non è in grado di contattare l'origine ora definita.

Ho avuto questo problema durante gli incidenti di failover del cluster quando il mio sistema di presenza di tempo biometrico è in esecuzione/in uso.

Per annullare la manipolazione dell'orologio locale, qualcuno effettua il clock, io chiedo all'istanza del cluster SQL che ore sono.

Impossibile ottenere un'origine ora attiva valida e restituisce questa data.

Soluzione temporanea per me è semplice controllando questa data nel mio GetServerTime Sub e utilizzando l'ora del PC locale se viene restituito questo 'valore predefinito'.

L'ho visto con SQL 2000/2005/2008, tutto tramite ADO e VB6.

Problemi correlati