SQL Server Datetime vs. Datetime2

Existuje mnoho času a formáty data v SQL Serveru s různými rozsahy, přesnost, skladování velikosti a uživatelem definované zlomkové druhé přesnosti.

níže je uveden krátký přehled:

chceme se zaměřit na srovnání formátu datetime a datetime2. V mé současné společnosti se setkávám s mnoha staršími tabulkami, které používají datetime. Datetime2 byl poprvé představen v SQL Server 2008. Domnívám se však, že někteří vývojáři prostě nevědí o výhodách a nevýhodách datetime2.

Datetime

pojďme nejprve diskutovat datetime trochu. Jak vidíte výše, potřebuje 8 bajtů úložiště a má rozsah od 1753-01-01 do 9999-12-31. Zejména má krátký dosah dozadu. Je to proto, že Velká Británie se v roce 1752 přesunula z juliánského do gregoriánského kalendáře přeskočením několika dní. Přesněji řečeno, 2. Září 1752 následovalo 14. Září 1752. Protože Datum před rokem 1753 by bylo nejednoznačné, Typ datetime není platný před rokem 1753. Další docela nápadný vlastnost datetime datový typ, je přesnost 0.00333 sekund, který je ve skutečnosti 1/300 sekundy.

zdá se to trochu divné. Nemáme milisekundovou přesnost s datetime. Dobře, ale proč? Pojďme analyzovat datový typ datetime do hloubky. V datetime používáme 4 bajty pro datum a 4 bajty pro čas. Jak to přesně funguje? Pojďme se podívat.

DECLARE @test DATETIME = '2015-11-29 10:00:00.000';SELECT CAST(@test as varbinary(8))> 0x0000A55F00A4CB80

takže 0x0000A55F00A4CB80 je hexadecimální. Rozdělíme 8 bajtů na dva kusy. Nejprve Datum. 0x0000A55F představuje datum. V desítkové soustavě je 42335. To je počet dnů, které uplynuly od roku 1900-01-01. Důkaz:

SELECT DATEADD(DD,42335,'1900-01-01')> 2015-11-29

nyní máme poslední 4 bajty 0xA4CB80 přeložené na desetinné místo je 10800000. To znamená 10800000 klíšťat od půlnoci. Pamatuješ, jak jsem říkal, že přesnost je 1/300 sekundy? To je způsobeno skutečností, že datetime ukládá čas do klíšťat. Takže 10800000 klíšťat od půlnoci znamená 10800000 krát 1/300 sekundy. Pojďme si trochu spočítat.

takže máme přesně 10 hodin od půlnoci a to se dokonale překládá do 10: 00: 00. V kombinaci s datem máme 2015-11-29 10: 00: 00.

nezapomeňte, že datetime používá vždy 8 bajtů úložiště a také mějte na paměti, že první čtyři bajty představující Datum mohou být záporné (2komplement), protože datum může být před 1900. Například v 1890-11-29 získáte první 4 bajty jako 0xFFFFF308, což se překládá jako 32bitový 2-doplněk k -3320. A 3320 odečteno od 1900-01-01 je přesně 1890-11-29.

datetime2

všechny datové a časové typy zavedené s SQL Server 2008 mají zcela nový typ úložiště, který nyní prozkoumáme. Datový typ datetime2 používá 6 na 8 bajtů v závislosti na milisekundové přesnosti.

DECLARE @test DATETIME2(3) = '2015-11-29 10:00:00.000';SELECT CAST(@test as varbinary(8))> 0x0300512502BA3A0B

tentokrát se to trochu komplikuje. Ve všech nových datatypech datetime představují poslední tři bajty Datum. To je způsobeno změnou pořadí bajtů. Takže datetime je uložen jako malý endian, což znamená, že nejvýznamnější bajt je zcela vlevo, zatímco ve velkém endianu je nejvýznamnější bajt uložen na pravé pozici.

to znamená, že když vezmeme 0x0300512502BA3A0B, datum není 0xBA3A0B, ale 0x0B3ABA, protože jeden bajt je 2 hexadecimální číslice.

opět s matematikou: 0x0B3ABA představuje desetinné číslo 735930. To je přesně to datum, kdy jsme chtěli:

SELECT DATEADD(DD,735930,CAST('0001-01-01' as date))> 2015-11-29

Nyní, že bajty jsou převedeny můžeme vzít poslední bajtů little endian reprezentaci, která je 0x0225510003. Mějte na paměti, že poslední bajt v little endian (první byte v původní big endian) je přesnost uvedených. Jak vidíte, definovali jsme datetime2 (3), což znamená, že náš poslední bajt je 0x03.

dělat matematiku: 0x02255100 je v desítkové soustavě 36000000. Protože jsme použili přesnost 3, což znamená 3místnou přesnost, vypočítáme sekundy nejprve vydělením našeho čísla 10 na sílu přesnosti, která je v našem případě 103.

to se také dokonale překládá na 10 hodin 0 minut 0 sekund, jak je uvedeno.

datetime vs datetime2

konečně jednoduché a prosté srovnání mezi těmito dvěma datatypy.

datetime datetime2
max přesné liché přesnost 1/300 100 nanosekundy přesnost
uživatelsky definované přesnost ne ano, od 0 do 7
úložný prostor vždy 8 bajtů 6 – 8 bajty v závislosti na přesnosti
použitelné s + nebo – operátor ano ne, použít datediff, dateadd atd.
SQL Standard kompatibilní ne ano

Takže celkově vidíte datetime používá potenciálně více úložného prostoru, má nižší a zvláštní přesnost, má nižší rozsah a není kompatibilní s SQL Standard, který dělá váš kód chovat odlišně na různých DBMS. Takže pokud vaše aplikace podporuje Datum, datetime2 a datetimeoffset silně doporučuji používat nové datové typy datetime, protože nemají téměř žádnou nevýhodu.

děkujeme za váš čas. Pro více zajímavých článků navštivte http://www.dirtyread.de/

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.