Inleiding
Gegevenstypen zijn attributen die het soort gegevens specificeren dat objecten zoals kolommen, lokale variabelen, expressies en parameters kunnen bevatten. In de RDBMS-wereld worden gegevenstypen doorgaans gegroepeerd in tekenreeks-, numerieke en datumgegevenstypen.
T-SQL ondersteunt 6 datum- en tijdgegevenstypen namelijk:
- Datum
- Smalldatetime
- Datum
- Tijd
- Datumtijd2
- Datetimeoffset
De eerste twee gegevenstypen worden beschouwd als oudere versies van de nieuwere. In dit artikel richten we ons op de datumgegevenstypen en in het bijzonder op de datetime en datetime2 gegevenstypen die beschikbaar zijn in SQL Server. Tabel 1 geeft details van de verschillende datum- en tijdgegevenstypen die beschikbaar zijn in SQL Server.
[tabel id=59 /]
Tab 1 Datum- en tijdgegevenstypen
Datetime en Datetime2
Datatime is een datatype dat datum en tijd combineert in een 24-uurs klokformaat. Het datumbereik dat wordt ondersteund in het datatype datetime is zoals weergegeven in Tab 1 en heeft een nauwkeurigheid van ongeveer 3 milliseconden.
Datetime2 is een uitbreiding van het datatype datetime. Het biedt plaats aan een breder scala aan mogelijke waarden en heeft een nauwkeurigheid van 100 nanoseconden, wat veel beter is dan zijn voorganger. Een ander belangrijk aspect van het dattime2-gegevenstype is dat de vereiste opslagruimte varieert van 6 tot 8 bytes, afhankelijk van de precisie die u kiest.
- Je kunt een precisie van 1 milliseconde bereiken door drie decimalen toe te staan op de secondecomponent. Elke waarde zal dus zes bytes in beslag nemen.
- Je kunt een precisie van 100 nanoseconden bereiken door zeven decimalen toe te staan op de secondencomponent. Elke waarde verbruikt dus acht bytes.
Demonstraties
Voeg verkeerde datumwaarden in
We maken een tabel met de details die worden weergegeven in Lijst 1 om een paar demonstraties uit te voeren die illustreren hoe de datetime te manipuleren. en datetime2 gegevenstypen.
-- Listing 1 Create Table and insert Rows -- Create Table with Data Types use Practice2017 go create table staffers ( fname varchar(50), lname varchar(50), JobTitle varchar(100), DOB datetime, PreciseDOB datetime2, LastLoginTime time) go
Vervolgens proberen we de tabel te vullen met één rij zoals weergegeven in Listing 2, maar we krijgen de fout weergegeven in Fig. 1. Het sleutelwoord in de foutmelding is "out-of-range" waarden. Wat het zegt, is dat haar waarde die we proberen in te voegen lager is dan 01-jan-1753 of hoger dan 31-dec-9999 . In dit geval is het probleem dat we niet het aanbevolen invoerformaat 'JJJJMMDD uu:mm:ss.nnn hebben gebruikt. ’ (zie Tabel 1). Lezen van de waarde '06101979 ', SQL Server gaat ervan uit dat 0610 het jaar is (komt overeen met YYYY). Deze fout wordt niet gegenereerd voor het datatype datetime2 omdat het bereik voor datetime2 groter is vanaf het jaar 0001.
-- Listing 2 Insert Rows with Wrong Entry Format insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'06101979' ,'06101979' ,'8:00 AM' )
Fig. 1 Fout geretourneerd voor datum/tijd-kolom
Correcte datumwaarden invoegen
We proberen het probleem te corrigeren door het juiste invoerformaat voor de datetime-kolom in te voeren, zoals weergegeven in Listing 3. Wanneer we de instructie opnieuw uitvoeren, krijgen we de fout die wordt weergegeven in Fig. 2. Deze fout wordt in wezen veroorzaakt door dezelfde fout die wordt gevolgd de specificaties van het invoerformaat. Het probleem ligt echter bij het andere deel van de datum '06101979 ' die overeenkomt met het invoerformaat 'JJJJMMDD uu:mm:ss.nnn ’. In dit geval ging SQL Server uit van 19 Is een maand en 79 is een dag van de maand. Een poging tot deze impliciete conversie mislukt omdat geen van de voorgaande beweringen waar is.
-- Listing 3 Insert Rows with One Correct Entry Format insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'19791006' ,'01061979' ,'8:00 AM' )
Fig. 2 Fout geretourneerd voor kolom Datetime2
Lijst 4 stelt ons in staat om de laatste bewering aan te tonen. De waarde 01101201 past in het bereik voor datetime2 en we kunnen de rij invoegen. Deze waarde vertaalt zich naar 1 december 0110 zoals we zien in figuur 3.
-- Listing 4: Insert Rows with Correct Date Format insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'19791006' ,'01101201' ,'8:00 AM')
-- Listing 5: Insert Rows with All Correct Entry Format insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'19791006' ,'19791006' ,'8:00 AM' )
De gegevens verifiëren
Fig. 3 De dataset opvragen
Wanneer we de staftabel doorzoeken, zien we duidelijk de precisie van het datetime-gegevenstype in vergelijking met het datetime2-alternatief. Laten we verder gaan met iets sinisters:taalinstellingen. Kijk eens naar Listing 6. We voegen exact dezelfde records in met het datumformaat 10/06/1979 . Dit formaat is NIET taalneutraal, dus wanneer we de taal instellen op Brits in de eerste instructie en vervolgens naar us_english in de tweede zien we dat we twee verschillende datums hebben ingevoegd, hoewel onze ruwe waarden hetzelfde zijn. Daarom is het zo belangrijk om altijd het aanbevolen invoerformaat te gebruiken bij het omgaan met datetime en datetime2 .
-- Listing 6: Impact of Language Settings set language british insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'06/10/1979' ,'06/10/1979' ,'8:00 AM' ) set language us_english insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'06/10/1979' ,'06/10/1979' ,'8:00 AM' )
Fig. 4 Vragen stellen aan stafleden
Met de taalinstelling als Brits , interpreteert SQL Server de eerste twee cijfers als de dag, maar met de taalinstelling als us_english , interpreteert SQL Server de eerste twee cijfers als een maand. Een laatste ding dat we hier moeten vermelden, is dat we bij het invoegen van onze records niet de tijdcomponent hebben gespecificeerd, dus SQL Server neemt automatisch aan dat het gemiddelde middernacht van de opgegeven datum was.
Conclusie
In dit artikel hebben we geleerd hoe de datatypes datetime en datetime2 eruit zien, wat de belangrijkste verschillen zijn en hoe je ervoor kunt zorgen dat je de juiste datum invoert wanneer je deze datatypes gebruikt. In de loop daarvan hebben we ook twee fouten onderzocht die een ontwikkelaar zou kunnen tegenkomen bij het werken met deze gegevenstypen.
Referenties
- SQL-gegevenstypen
- Ben-Gan, I. (2016) T-SQL-grondbeginselen. blz. 74-78. Microsoft Press.