web-dev-qa-db-fra.com

Pourquoi 1899-12-30 est-il la date zéro dans Access/SQL Server au lieu de 12/31?

Plus par curiosité que tout problème réel; la question a été posée aujourd'hui et je sais que j'ai vu 1899-12-30 utilisé comme date "par défaut" et une date zéro dans Access et dans les anciennes applications SQL Server. Je me demandais simplement pourquoi - d'où cela venait-il et pourquoi 1899-12-31 n'est-il pas utilisé?

28
Peter Tirrell

Maintien de la compatibilité avec Lotus 1-2-3 à l’époque, ce qui posait un problème en ce sens qu’il pensait que l’année 1900 était une année bissextile (ou prétendue?).

L'explication est trop longue pour être citée, mais pour des raisons de curiosité, voici quelques extraits.

1900 n'était pas une année bissextile.

"C'est un bug dans Excel!" M'écriai-je.

"Bien, pas vraiment", dit Ed. "Nous devions procéder de cette façon car nous devions pouvoir importer des feuilles de calcul Lotus 123".

"Alors, c'est un bug dans Lotus 123?"

"Oui, mais probablement intentionnelle. Lotus devait rentrer dans 640K. Ce n’est pas beaucoup de mémoire. Si vous ignorez 1900, vous pouvez déterminer si une année donnée est une année bissextile simplement en regardant si les deux bits les plus à droite C'est vraiment simple et rapide. Les gars de Lotus ont probablement pensé qu'il n'était pas important de se tromper pendant ces deux mois passés. Il semblerait que les gars de Basic voulaient être anal à propos de ces deux mois, alors ils ont déplacé le Époque un jour de retour. "

En réalité, ce nombre est supérieur au nombre réel de jours. En effet, Excel se comporte comme si la date 1900-février-29 existait. Il n'a pas. L'année 1900 n'était pas une année bissextile (l'année 2000 est une année bissextile). Dans Excel, le lendemain de 1900-février-28 est de 1900-février-29. En réalité, le lendemain de 1900-février-28 était 1900-mars-1. Ce n'est pas un bug". En effet, c'est par conception. Excel fonctionne de cette manière car il s’agissait vraiment d’un bogue dans Lotus 123. Lors de son introduction, Excel représentait presque tout le marché des tableurs. Microsoft a décidé de poursuivre le bogue de Lotus afin d'être pleinement compatible. Les utilisateurs qui sont passés de 123 à Excel n'auraient pas à modifier leurs données. Tant que toutes vos dates après 1900-mars-1, cela ne devrait pas vous inquiéter. 

43
wkl

À ma connaissance, le type de date n'existait pas dans "SQL Server ancien". Il a été introduit dans SQL Server 2008 avec la valeur de date zéro correspondant au 0001/01/01. 

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

Les énoncés de questions n'ont pas de sens. Si le type de date existait dans "SQL Server plus ancien", la compatibilité avec le type de date dans SQL Server 2008 aurait été rompue. 

Il est inutile de répondre (et d'augmenter le nombre de posts) à la question avec des termes indéfinis ou mal définis. 

SQL Server semble renvoyer cette date par défaut s'il ne peut pas contacter la source de temps définie.

Cela s'est produit lors d'incidents de basculement de cluster lorsque mon système de pointage biométrique fonctionne/est utilisé.

Pour vaincre la manipulation de l'horloge locale, quelqu'un s'installe, je demande à l'instance de cluster SQL de quelle heure il est.

Il ne peut pas obtenir une source de temps active valide et renvoie cette date.

La solution pour moi est simple: recherchez cette date dans ma GetServerTime Sub et utilisez l'heure locale du PC si cette "valeur par défaut" est renvoyée.

J'ai vu cela avec SQL 2000/2005/2008, le tout via ADO et VB6.

0
Dougie Lindsay