sql >> Database teknologi >  >> RDS >> Database

T-SQL Datetime Data Type

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:

  1. Dato og klokkeslæt
  2. Smalldatetime
  3. Dato
  4. Tid
  5. Dato/klokkeslæt2
  6. 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.

  1. Hvordan håndhæver jeg sætlignende unikhed mellem flere kolonner?

  2. Funktion vs. lagret procedure i SQL Server

  3. Oracle tabel dynamisk partition

  4. Hvad gør en SQL-sætning sargerbar?