Domanda

Mi chiedo, perché SqlDateTime.MinValue non è lo stesso di DateTime.MinValue?

È stato utile?

Soluzione

Penso che la differenza tra i tipi di dati Data di SQL e .NET derivi dal fatto che il tipo di dati datetime di SQL Server, sono i valori minimo e massimo e la precisione sono molto più vecchio del tipo di dati DateTime di .NET.

Con l'avvento di .NET, il team ha deciso che il tipo di dati Datetime dovrebbe avere un valore minimo più naturale e 01/01/0001 sembra una scelta abbastanza logica, e sicuramente da un < em> linguaggio di programmazione , anziché la prospettiva database , questo valore è più naturale.

Per inciso, con SQL Server 2008, ci sono una serie di nuovi tipi di dati basati sulla data ( Data , Time , DateTime2 , DateTimeOffset ) che offre effettivamente un intervallo e una precisione maggiori e si associa strettamente al tipo di dati DateTime in .NET. Ad esempio, il tipo di dati DateTime2 ha un intervallo di date compreso tra 0001-01-01 e 9999-12-31.

Lo standard "datetime" il tipo di dati di SQL Server ha sempre avuto un valore minimo di 01/01/1753 (e in effetti lo è ancora!). Devo ammettere che anch'io ero curioso del significato di questo valore, così ho fatto qualche ricerca. Quello che ho trovato è stato il seguente:

  

Durante il periodo tra il 1 d.C. e oggi, il mondo occidentale ha effettivamente utilizzato due calendari principali: il calendario giuliano di Giulio Cesare e il calendario gregoriano di Papa Gregorio XIII. I due calendari differiscono rispetto a una sola regola: la regola per decidere che anno bisestile. Nel calendario giuliano, tutti gli anni divisibili per quattro sono anni bisestili. Nel calendario gregoriano, tutti gli anni divisibili per quattro sono anni bisestili, tranne che gli anni divisibili per 100 (ma non divisibili per 400) non sono anni bisestili. Pertanto, gli anni 1700, 1800 e 1900 sono anni bisestili nel calendario giuliano ma non nel calendario gregoriano, mentre gli anni 1600 e 2000 sono anni bisestili in entrambi i calendari.

     

Quando Papa Gregorio XIII introdusse il suo calendario nel 1582, ordinò anche che i giorni tra il 4 ottobre 1582 e il 15 ottobre 1582 dovessero essere saltati, cioè disse che il giorno dopo il 4 ottobre dovrebbe essere il 15 ottobre Tuttavia, molti paesi hanno ritardato il passaggio. L'Inghilterra e le sue colonie non passarono da Julian alla resa dei conti gregoriana fino al 1752, quindi per loro, le date saltate furono tra il 4 settembre e il 14 settembre 1752. Altri paesi cambiarono altre volte, ma il 1582 e il 1752 sono le date rilevanti per DBMS di cui stiamo discutendo.

     

Quindi, due problemi sorgono con l'aritmetica della data quando si risale a molti anni fa. Il primo è, bisognerebbe saltare anni prima che il passaggio venga calcolato secondo le regole giuliana o gregoriana? Il secondo problema è, quando e come devono essere gestiti i giorni saltati?

     

Ecco come i Big Eight DBMS gestiscono queste domande:

     
      
  • Fingi che non ci siano interruttori. Questo è ciò che sembra richiedere lo standard SQL, anche se il documento standard non è chiaro: dice solo che le date sono "vincolate dalle regole naturali per le date usando il calendario gregoriano", qualunque cosa, "regole naturali". siamo. Questa è l'opzione scelta da DB2. Quando si fa finta che le regole di un singolo calendario siano sempre state applicate anche in periodi in cui nessuno ha sentito parlare del calendario, il termine tecnico è che un "prolettico" il calendario è in vigore. Quindi, ad esempio, potremmo dire che DB2 segue un proletico calendario gregoriano.

  •   
  • Evita del tutto il problema. Microsoft e Sybase hanno impostato i valori di data minima al 1 ° gennaio 1753, in modo sicuro oltre l'orario in cui l'America ha cambiato calendario. Ciò è difendibile, ma di tanto in tanto emergono lamentele sul fatto che questi due DBMS mancano di una funzionalità utile degli altri DBMS e che lo standard SQL richiede.

  •   
  • Scegli 1582. Questo è ciò che Oracle ha fatto. Un utente Oracle troverebbe che l'espressione aritmetica data 15 ottobre 1582 meno 4 ottobre 1582 restituisce un valore di 1 giorno (perché il 5–14 ottobre non esiste) e che la data 29 febbraio 1300 è valida (perché il salto di Julian- si applica la regola dell'anno). Perché Oracle ha avuto ulteriori problemi quando lo standard SQL non sembra richiederlo? La risposta è che gli utenti potrebbero richiederlo. Gli storici e gli astronomi usano questo sistema ibrido al posto di un proletico calendario gregoriano. (Questa è anche l'opzione predefinita che Sun ha scelto durante l'implementazione della classe GregorianCalendar per Java — nonostante il nome, GregorianCalendar è un calendario ibrido.)

  •   

Questa citazione sopra è tratta dal seguente link:

Ottimizzazione delle prestazioni di SQL: date in SQL

Altri suggerimenti

Poiché in SQL Server la data minima che può essere archiviata in un campo datetime (1753/1/1), non è uguale al MinValue del tipo di dati DateTime .NET (0001/1/1).

Il 1753 fu la data del primo adotta il calendario gregoriano (Inghilterra). Per quanto riguarda il motivo per cui questo è stato scelto rispetto al 01/01/0001 - è senza dubbio un'eredità di quando SQL Server era Sybase negli anni '90. Devono aver preso presto la decisione di progettazione e il team di Microsoft SQL non ha visto un motivo per cambiarla.

Dall'esplosione di .NET e dalla sua integrazione in SQL Server, ora c'è DateTime2 per compatibilità. Se sei un utente NHibernate, puoi fornire questo tipo nelle mappature dei tipi per evitare problemi DateTime.Min

Le date .NET soddisfano altri calendari oltre a quello gregoriano:

  • Calendario
    • ChineseLunisolarCalendar
    • EastAsianLunisolarCalendar
    • GregorianCalendar
    • calendario ebraico
    • HijriCalendar
    • calendario giapponese
    • JapaneseLunisolarCalendar
    • JulianCalendar
    • KoreanCalendar
    • KoreanLunisolarCalendar
    • PersianCalendar
    • TaiwanCalendar
    • TaiwanLunisolarCalendar
    • ThaiBuddhistCalendar
    • UmAlQuraCalendar

Le date precedenti JulianCalendar DateTime.MinValue

Due diversi gruppi hanno deciso quale "minimo" significa per loro per quanto riguarda la data / ora.

SQL utilizza una rappresentazione interna diversa per DateTime.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top