Introduktion
Datatyper er attributter, der specificerer den type data, som objekter såsom kolonner, lokale variabler, udtryk og parametre kan indeholde. På tværs af RDBMS-verdenen er datatyper typisk grupperet i streng-, numeriske og datodatatyper.
T-SQL understøtter 6 dato- og tidsdatatyper, nemlig:
- Dato og klokkeslæt
- Smalldatetime
- Dato
- Tid
- Dato/klokkeslæt2
- Datotidsforskydning
De to første datatyper betragtes som ældre versioner af de nyere. I denne artikel fokuserer vi på datodatatyperne og specifikt på datetime og datetime2 datatyper tilgængelige i SQL Server. Tabel 1 giver detaljer om de forskellige dato- og tidsdatatyper, der er tilgængelige i SQL Server.
[tabel id=59 /]
Fane 1 Dato- og tidsdatatyper
Datetime og Datetime2
Datatime er en datatype, der kombinerer dato med tid i et 24-timers urformat. Datointervallet, der understøttes i datetime-datatypen, er som vist i fane 1, og det har en nøjagtighed på omkring 3 millisekunder.
Datetime2 er en udvidelse af datetime-datatypen. Den rummer et bredere udvalg af mulige værdier og har en nøjagtighed på 100 nanosekunder, hvilket er meget bedre end sin forgænger. Et andet nøgleaspekt ved dattime2-datatypen er, at den nødvendige lagring varierer fra 6 til 8 bytes afhængigt af den præcision, du vælger.
- Du kan opnå en præcision på 1 millisekund ved at tillade tre decimaler på sekunder-komponenten. Hver værdi vil således forbruge seks bytes.
- Du kan opnå en præcision på 100 nanosekunder ved at tillade syv decimaler på sekunder-komponenten. Hver værdi vil således forbruge otte bytes.
Demonstrationer
Indsæt forkerte datoværdier
Vi opretter en tabel med detaljerne vist i liste 1 for at udføre nogle få demonstrationer, der illustrerer, hvordan man manipulerer dato-klokkeslættet og datetime2 datatyper.
-- 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
Derefter forsøger vi at udfylde tabellen med en række som vist i liste 2, men vi får fejlen vist i fig. 1. Nøgleordet i fejlmeddelelsen er "out-of-range" værdier. Hvad det siger er, at hendes værdi, vi forsøger at indsætte, enten er lavere end 01-jan-1753 eller højere end31. december-9999 . I dette tilfælde er problemet, at vi ikke har brugt det anbefalede indtastningsformat "ÅÅÅÅMMDD tt:mm:ss.nnn ’ (se tabel 1). Læser værdien "06101979 ', SQL Server antager, at 0610 er året (matchende ÅÅÅÅ). Denne fejl vises ikke for datatypen datetime2, fordi intervallet for datetime2 er bredere fra og med år 0001.
-- Listing 2 Insert Rows with Wrong Entry Format insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'06101979' ,'06101979' ,'8:00 AM' )
Fig. 1 Fejl returneret for Datetime Column
Indsæt korrekte datoværdier
Vi forsøger at rette problemet ved at indtaste det korrekte indtastningsformat for datetime-kolonnen som vist i liste 3. Når vi kører sætningen igen, får vi fejlen vist i fig. specifikationerne for indgangsformat. Men problemet ligger i den anden del af datoen "06101979 ' som matcher indtastningsformatet 'ÅÅÅÅMMDD tt:mm:ss.nnn ’. I dette tilfælde antog SQL Server 19 Er en måned og 79 er en dag i måneden. Forsøg på denne implicitte konvertering mislykkes, da ingen af de foregående påstande er sande.
-- Listing 3 Insert Rows with One Correct Entry Format insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'19791006' ,'01061979' ,'8:00 AM' )
Fig. 2 Fejl returneret for Datetime2 Column
Liste 4 giver os mulighed for at demonstrere den sidste påstand. Værdien 01101201 passer ind i intervallet for datetime2, og vi er i stand til at indsætte rækken. Denne værdi oversættes til 1. december 0110, som vi ser i fig. 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' )
Bekræftelse af dataene
Fig. 3 Forespørgsel i datasættet
Når vi forespørger i personaletabellen, ser vi tydeligt præcisionen af datetime-datatypen sammenlignet med datetime2-alternativet. Lad os gå videre til noget lidt mere uhyggeligt:Sprogindstillinger. Tag et kig på liste 6. Vi indsætter nøjagtig de samme poster ved hjælp af datoformatet 06/10/1979 . Dette format er IKKE sprogneutralt, så når vi indstiller sproget til britisk i den første sætning og derefter til us_english i den anden finder vi, at vi har indsat to forskellige datoer, faktisk selvom vores råværdier er de samme. Det er derfor, det er så vigtigt altid at bruge det anbefalede indtastningsformat, når du har at gøre med datetime og 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 Forespørgsel på medarbejdere
Med sprogindstillingen som britisk , SQL Server fortolker de første to tal som dagen, men med sprogindstillingen som us_english , SQL Server fortolker de første to tal som en måned. En sidste ting, som vi er nødt til at nævne her, er, at ved indsættelse af vores registreringer specificerede vi ikke tidskomponenten, så SQL Server antager automatisk, at det var midnat på den angivne dato.
Konklusion
I denne artikel har vi lært, hvordan datatyperne datetime og datetime2 ser ud, deres vigtigste forskelle, og hvordan du sikrer dig, at du indtaster den korrekte dato, når du bruger disse datatyper. I løbet af det har vi også undersøgt to fejl, som en udvikler kan løbe ind i, når de arbejder med disse datatyper.
Referencer
- SQL-datatyper
- Ben-Gan, I. (2016) T-SQL Fundamentals. s. 74-78. Microsoft Press.