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?
risposta
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.
Risposta eccezionale e un fatto interessante! :) –
* Spero sicuramente * che in realtà non fosse un bug intenzionale ... – Andy
@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
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.
Intendevo il tipo datetime in SQL Server; Ho visto quella data utilizzata per impostare i valori predefiniti in passato e mi chiedevo perché. È tutto. –
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.
- 1. Perché la divisione risulta in zero anziché in decimale?
- 2. Perché utilizziamo array a lunghezza zero anziché puntatori?
- 3. Ottenere la data corrente in SQL Server?
- 4. Perché FLT_MIN è uguale a zero?
- 5. SQL Server, divisione restituisce zero
- 6. Perché il mio Rails.root è zero?
- 7. Perché System.in è dichiarato nullInputStream() anziché null?
- 8. Perché NDEBUG anziché RELEASE?
- 9. Rails dove la data è maggiore di data query data
- 10. Perché utilizzare Celery anziché RabbitMQ?
- 11. C# Ticks convertono in data java; la data è 5 ore dietro perché?
- 12. Perché testFixture anziché TestClass?
- 13. MySQL ERRORE 1231 (42000): La variabile 'character_set_client' non può essere impostata sul valore 'NULL'
- 14. (. *) Anziché (. *?)
- 15. Converti la data in zecche in SQL Server
- 16. Perché questa sottrazione non è uguale a zero?
- 17. È zero (-0) equivalente a zero (0) in C#
- 18. Perché Go ha digitato zero?
- 19. Perché utilizzare GWT.create() anziché nuovo?
- 20. Perché utilizzare AsQueryable() anziché List()?
- 21. Perché usare argparse anziché optparse?
- 22. Perché utilizzare Function.prototype.bind anziché Function.prototype.call?
- 23. Perché utilizzare TimeSpan.CompareTo() anziché < > o =
- 24. Perché utilizzare typedef anziché #defines?
- 25. Perché l'allocazione ha esito positivo per la dimensione zero byte?
- 26. La programmazione funzionale in Rust è a costo zero?
- 27. Come ottenere la data del server in JavaScript
- 28. problema con tipo data data SQL Server
- 29. Perché questa query di Lucene è "contiene" anziché "startsWith"?
- 30. Trova la data più vicina in SQL Server
Puoi essere più specifico - in quale versione di SQL Server? Mi piacerebbe sapere –
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. –
Ha chiesto, ho risposto, non avevo idea che avrebbe generato questa risposta. – birryree