sql >> Databasteknik >  >> RDS >> Database

T-SQL Datetime Data Type

Introduktion

Datatyper är attribut som anger vilken typ av data som objekt som kolumner, lokala variabler, uttryck och parametrar kan innehålla. Över hela RDBMS-världen grupperas datatyper vanligtvis i sträng-, numeriska och datumdatatyper.

T-SQL stöder 6 datatyper för datum och tid, nämligen:

  1. Datum och tid
  2. Smalldatetime
  3. Datum
  4. Tid
  5. Datumtid2
  6. Förskjutning av datum och tid

De två första datatyperna anses vara äldre versioner av de nyare. I den här artikeln fokuserar vi på datumdatatyperna och, specifikt, på datetime och datetime2 datatyper tillgängliga i SQL Server. Tabell 1 ger information om de olika datum- och tidsdatatyperna som är tillgängliga i SQL Server.

[tabell id=59 /]

Flik 1 Datatyper för datum och tid

Datetime och Datetime2

Datatime är en datatyp som kombinerar datum med tid i ett 24-timmarsklockformat. Datumintervallet som stöds i datetime-datatypen är som visas i flik 1 och det har en noggrannhet på cirka 3 millisekunder.

Datetime2 är en förlängning av datatypen datetime. Den rymmer ett bredare spektrum av möjliga värden och har en noggrannhet på 100 nanosekunder vilket är mycket bättre än sin föregångare. En annan viktig aspekt av dattime2-datatypen är att lagringen som krävs varierar från 6 till 8 byte beroende på vilken precision du väljer.

  • Du kan uppnå en precision på 1 millisekund genom att tillåta tre decimaler på sekundkomponenten. Varje värde kommer alltså att förbruka sex byte.
  • Du kan uppnå en precision på 100 nanosekunder genom att tillåta sju decimaler på sekundkomponenten. Varje värde kommer alltså att förbruka åtta byte.

Demonstrationer

Infoga fel datumvärden

Vi skapar en tabell med detaljerna som visas i Lista 1 för att utföra några demonstrationer som illustrerar hur man manipulerar datetime och 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

Sedan försöker vi fylla i tabellen med en rad som visas i Lista 2 men vi får felet som visas i Fig. 1. Nyckelordet i felmeddelandet är "out-of-range"-värden. Vad det säger är att hennes värde som vi försöker infoga antingen är lägre än 01-jan-1753 eller högre än31 december 9999 . I det här fallet är problemet att vi inte har använt det rekommenderade inmatningsformatet "ÅÅÅÅMMDD hh:mm:ss.nnn ’ (se tabell 1). Läser värdet "06101979 ’, SQL Server antar att 0610 är året (matchar ÅÅÅÅ). Det här felet visas inte för datatypen datetime2 eftersom intervallet för datetime2 är bredare från och 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 Fel returnerat för kolumnen Datetime

Infoga korrekta datumvärden

Vi försöker åtgärda problemet genom att ange rätt inmatningsformat för datetime-kolumnen som visas i Lista 3. När vi kör satsen igen får vi felet som visas i Fig. 2. Detta fel orsakas i huvudsak av samma misslyckande att följa specifikationerna för inmatningsformatet. Problemet ligger dock i den andra delen av datumet "06101979 ' som matchar inmatningsformatet 'ÅÅÅÅMMDD hh:mm:ss.nnn ’. I det här fallet antog SQL Server 19 Är en månad och 79 är en dag i månaden. Att försöka denna implicita omvandling misslyckas eftersom inget av de föregående påståendena är sant.

-- Listing 3 Insert Rows with One Correct Entry Format
insert into staffers 
values
(
'Kenneth'
,'Igiri'
,'Database Administrator'
,'19791006'
,'01061979'
,'8:00 AM'
)

Fig. 2 Fel returnerat för kolumn Datetime2

Lista 4 tillåter oss att demonstrera det sista påståendet. Värdet 01101201 passar in i intervallet för datetime2 och vi kan infoga raden. Detta värde översätts till 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'
)

Verifiera data

Fig. 3 Fråga efter datamängden

När vi frågar personaltabellen ser vi tydligt precisionen för datetime-datatypen jämfört med datetime2-alternativet. Låt oss gå vidare till något lite mer läskigt:språkinställningar. Ta en titt på Lista 6. Vi infogar exakt samma poster med datumformatet 06/10/1979 . Det här formatet är INTE språkneutralt, så när vi ställer in språket till brittiska i det första uttalandet och sedan till us_english i den andra finner vi att vi har infogat två olika datum faktiskt även om våra råvärden är desamma. Det är därför det är så viktigt att alltid använda det rekommenderade inmatningsformatet när du har att göra med datetime och 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 Fråga personal

Med språkinställningen brittisk , SQL Server tolkar de två första siffrorna som dagen men med språkinställningen som us_english , SQL Server tolkar de två första siffrorna som en månad. En sista sak som vi behöver nämna här är att när vi infogade våra poster, angav vi inte tidskomponenten, så SQL Server antar automatiskt att det var medelvärde midnatt det angivna datumet.

Slutsats

I den här artikeln har vi lärt oss hur datatyperna datetime och datetime2 ser ut, deras viktigaste skillnader och hur du ser till att du anger rätt datum när du använder dessa datatyper. Under det har vi också undersökt två fel som en utvecklare kan stöta på när de arbetar med dessa datatyper.

Referenser

  • SQL-datatyper
  • Ben-Gan, I. (2016) T-SQL Fundamentals. sid 74-78. Microsoft Press.

  1. Välj / Infoga version av en Upsert:finns det ett designmönster för hög samtidighet?

  2. Reparera korrupt databas postgresql

  3. Vad är det bästa sättet att ansluta mellan Android och Oracle-databasen?

  4. VBA Alchemy:Förvandla metoder till egenskaper