Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Qual è il significato di 1/1/1753 in SQL Server?

La decisione di utilizzare il 1 gennaio 1753 (1753-01-01 ) come valore di data minimo per un datetime in SQL Server che risale alle origini Sybase.

Il significato della data stessa però può essere attribuito a quest'uomo.

Philip Stanhope, 4° conte di Chesterfield. Chi ha guidato il Calendar (New Style) Act 1750 attraverso il Parlamento britannico. Ciò ha legiferato per l'adozione del calendario gregoriano per la Gran Bretagna e le sue allora colonie.

Ci sono stati alcuni giorni mancanti (collegamento all'archivio Internet) nel calendario britannico nel 1752, quando finalmente l'adeguamento fu effettuato dal calendario giuliano. Dal 3 settembre 1752 al 13 settembre 1752 andarono perduti.

Kalen Delaney ha spiegato la scelta in questo modo

Quindi, con 12 giorni persi, come puoi calcolare le date? Ad esempio, come puoi calcolare il numero di giorni tra il 12 ottobre 1492 e il 4 luglio 1776? Includi quelli mancanti di 12 giorni? Per evitare di dover risolvere questo problema, gli sviluppatori originali di Sybase SQL Server hanno deciso di non consentire date precedenti al 1753. È possibile memorizzare date precedenti utilizzando i campi carattere, ma non è possibile utilizzare funzioni datetime con le date precedenti memorizzate nei campi carattere.

La scelta del 1753 sembra alquanto anglocentrica, tuttavia, poiché molti paesi cattolici in Europa utilizzavano il calendario da 170 anni prima dell'attuazione britannica (originariamente ritardata a causa dell'opposizione della chiesa). Al contrario, molti paesi non hanno riformato i loro calendari fino a molto tempo dopo, nel 1918 in Russia. Infatti il ​​7 novembre iniziò la Rivoluzione d'Ottobre del 1917 secondo il calendario gregoriano.

Entrambi datetime e il nuovo datetime2 il tipo di dati menzionato nella risposta di Joe non tenta di tenere conto di queste differenze locali e utilizza semplicemente il calendario gregoriano.

Quindi con l'intervallo più ampio di datetime2

SELECT CONVERT(VARCHAR, DATEADD(DAY,-5,CAST('1752-09-13' AS DATETIME2)),100)

Resi

Sep  8 1752 12:00AM

Un ultimo punto con il datetime2 il tipo di dati è che utilizza il calendario gregoriano prolettico proiettato all'indietro ben prima che fosse effettivamente inventato, quindi è di utilità limitata nel trattare le date storiche.

Ciò contrasta con altre implementazioni software come la classe Java Gregorian Calendar che per impostazione predefinita segue il calendario giuliano per le date fino al 4 ottobre 1582, quindi salta al 15 ottobre 1582 nel nuovo calendario gregoriano. Gestisce correttamente il modello giuliano dell'anno bisestile prima di tale data e il modello gregoriano dopo tale data. La data di cutover può essere modificata dal chiamante chiamando setGregorianChange() .

Un articolo abbastanza divertente che discute alcune particolarità in più con l'adozione del calendario può essere trovato qui.