sql >> Databáze >  >> RDS >> Database

T-SQL Datetime Data Type

Úvod

Datové typy jsou atributy, které určují druh dat, která mohou objekty, jako jsou sloupce, lokální proměnné, výrazy a parametry, obsahovat. Ve světě RDBMS jsou datové typy obvykle seskupeny do řetězcových, číselných a datových typů.

T-SQL podporuje 6 typů dat a času, jmenovitě:

  1. Datum
  2. Smalldatetime
  3. Datum
  4. Čas
  5. Datum a čas2
  6. Posun data a času

První dva datové typy jsou považovány za starší verze novějších. V tomto článku se zaměříme na datové typy data a konkrétně na datetime a datetime2 datové typy dostupné na serveru SQL Server. Tabulka 1 uvádí podrobnosti o různých typech dat data a času dostupných na serveru SQL Server.

[id tabulky=59 /]

Karta 1 Typy dat data a času

Datum a čas2

Datatime je datový typ, který kombinuje datum s časem ve 24hodinovém formátu. Období podporované v datovém typu datetime je znázorněno na kartě 1 a má přesnost přibližně 3 milisekundy.

Datetime2 je rozšířením datového typu datetime. Pojme širší rozsah možných hodnot a má přesnost 100 nanosekund, což je mnohem lepší než jeho předchůdce. Dalším klíčovým aspektem datového typu dattime2 je, že požadované úložiště se pohybuje od 6 do 8 bajtů v závislosti na přesnosti, kterou zvolíte.

  • Můžete dosáhnout přesnosti 1 milisekundy, pokud na komponentu sekund povolíte tři desetinná místa. Každá hodnota tak spotřebuje šest bajtů.
  • Můžete dosáhnout přesnosti 100 nanosekund, pokud na komponentu sekund povolíte sedm desetinných míst. Každá hodnota tak spotřebuje osm bajtů.

Ukázky

Vložte nesprávné hodnoty data

Vytvoříme tabulku s podrobnostmi uvedenými ve výpisu 1, abychom provedli několik ukázek, které ilustrují, jak manipulovat s datetime a datetime2 datové typy.

-- 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

Poté se pokusíme naplnit tabulku jedním řádkem, jak je znázorněno ve výpisu 2, ale dostaneme chybu uvedenou na obr. 1. Klíčovým slovem v chybové zprávě jsou hodnoty „mimo rozsah“. Říká se, že její hodnota, kterou se snažíme vložit, je buď nižší než 01-Jan-1753 nebo vyšší než 31. prosince 9999 . V tomto případě je problém, že jsme nepoužili doporučený vstupní formát „RRRRMMDD hh:mm:ss.nnn “ (viz tabulka 1). Čtení hodnoty ‘06101979 ‘, SQL Server předpokládá 0610 jako rok (odpovídající YYYY). Tato chyba není vyvolána pro datový typ datetime2, protože rozsah pro datetime2 je od roku 0001 širší.

-- Listing 2 Insert Rows with Wrong Entry Format
insert into staffers 
values
(
'Kenneth'
,'Igiri'
,'Database Administrator'
,'06101979'
,'06101979'
,'8:00 AM'
)

Obr. 1 Vrácená chyba pro sloupec Datetime

Vložte správné hodnoty data

Snažíme se problém napravit zadáním správného formátu záznamu pro sloupec datetime, jak je znázorněno ve výpisu 3. Když příkaz spustíme znovu, dostaneme chybu znázorněnou na obr. 2. Tato chyba je v podstatě způsobena stejným nedodržením specifikace formátu vstupu. Problém však spočívá v druhé části data ‘06101979 “ který odpovídá formátu položky „RRRRMMDD hh:mm:ss.nnn '. V tomto případě SQL Server předpokládal 19 Je měsíc a 79 je den v měsíci. Pokus o tento implicitní převod selže, protože žádné z předchozích tvrzení není pravdivé.

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

Obr. 2 Vrácená chyba pro sloupec Datetime2

Výpis 4 nám umožňuje demonstrovat poslední tvrzení. Hodnota 01101201 zapadá do rozsahu pro datetime2 a jsme schopni vložit řádek. Tato hodnota se převádí na 1. prosince 0110, jak vidíme na obr. 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'
)

Ověření dat

Obr. 3 Dotazování souboru dat

Když se dotazujeme na tabulku zaměstnanců, jasně vidíme přesnost datového typu datetime ve srovnání s alternativou datetime2. Pojďme k něčemu trochu zlověstnějšímu:Nastavení jazyka. Podívejte se na výpis 6. Vkládáme přesně stejné záznamy ve formátu data 06/10/1979 . Tento formát NENÍ jazykově neutrální, když tedy nastavíme jazyk na British v prvním příkazu a poté na us_english ve druhém zjistíme, že jsme ve skutečnosti vložili dvě různá data, ačkoli naše hrubé hodnoty jsou stejné. Proto je při práci s datetime tak důležité vždy používat doporučený formát záznamu a 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'
)

Obr. 4 Dotazovací pracovníci

S nastavením jazyka na British , SQL Server interpretuje první dvě číslice jako den, ale s nastavením jazyka jako us_english SQL Server interpretuje první dvě čísla jako měsíc. Poslední věc, kterou zde musíme zmínit, je, že při vkládání našich záznamů jsme nespecifikovali časovou složku, takže SQL Server automaticky předpokládá, že byla střední půlnoc zadaného data.

Závěr

V tomto článku jsme se dozvěděli, jak vypadají datové typy datetime a datetime2, jejich hlavní rozdíly a jak se ujistit, že při používání těchto datových typů zadáváte správné datum. V jeho průběhu jsme také prozkoumali dvě chyby, na které by se vývojář mohl dostat při práci s těmito datovými typy.

Odkazy

  • Datové typy SQL
  • Ben-Gan, I. (2016) T-SQL Fundamentals. str. 74-78. Microsoft Press.

  1. Automatické zvýšení hodnoty 'id' při vkládání do sqlite

  2. PostgreSQL sekvence založená na jiném sloupci

  3. Příkaz ALTER TABLE byl v konfliktu s omezením FOREIGN KEY

  4. Omezení pouze pro jeden záznam označený jako výchozí