Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

December 10, 2007 / by Zsolt Soczó

SQL Server 2008 újdonságok 2. – Dátum típusok

Hát igen, már az SQL Server 2005-ben is úgy volt, hogy lesz DATE és TIME típus. Meg is írták CLR típusként, aztán kidobták, nem illett bele a képbe, kilökte azt a gazdatest.

Most, 2008-ban újra nekiláttak, ezúttal sikerrel (ha élcelődni szeretnék, márpedig miért ne, 10 éve kellett volna ezt meglépni).

No, mi a bajunk a DATETIME és SMALLDATETIME típusokkal.
1. Kicsi az értékkészletünk, 1753 előtt is volt már világ.
2. Kicsi a pontosságuk, a pontosabbnak, a DATETIME-nak is 3 ms a felbontása.
3. Nem kezelnek időzónát.
4. Nincs külön csak dátum és csak idő tároló típus. Eleve, sokszor csak az egyik kell, pl. napra kerekített dátum tárolás, és ilyenkor nem csak könnyebb kezelni a külön tárolt darabokat, de hely se kell neki annyi.

No, lássuk, mit kapunk hát a 2008-ban?

1. DATE típus. 0001-01-01 és 9999-12-31 között működik, és csak 3 byte-ot eszik. Nyilván nap a felbontása.

2. TIME típus. Maximum 100ns felbontású, lehet szabályozni, mennyire legyen pontos. TIME(7) pl. 100ns-os, és 5 byte-os igényel. TIME(0) csak 3 byte, cserébe csak század mp-ig pontos. Még egy példaként TIME(4) 4 byte, és 3-4 digitig pontos (kb. ms-os felbontás).

3. DATETIME2. Az előző kettő hibridje, 6-8 byte kell neki, nyilván az idő tag pontosságától függően.

4. DATETIMEOFFSET típus. A DATETIME2 időzónával kiegészített változata. Stringként így szoktuk leírni: ‘2007-05-08 12:35:29.1234567+12:15, azaz plusz 12 óra 15 perc az időeltolódás.

Ami izgi kérdés, hogyan látszanak ezek a típusok ADO.NET-ből, ráadásul, mit látunk 2.0-ból, és mit a 3.5-ből, ami már fel van készítve az új típusokra?

Először nézzük a 3.5-öt. Az SqlDbType-ban készült négy új érték:

SqlDbType.Date
SqlDbType.Time
SqlDbType.DateTime2
SqlDbType.DateTimeOffSet

Az SQL DATE és DATETIME2 a CLR megszokott DateTime típusára képződik le. A TIME a TimeSpanra, a DATETIMEOFFSET pedig egy új CLR típusra a System.DateTimeOffsetre alakul át. Bővebben itt.

Ez alapján a .NET fw. 2.0 SP1 és 3.0 SP1 is tartalmazza a DateTimeOffset-et. Furcsa mód, reflectorral megnézve a 3.5-ös mscorlibet nem találtam benne ezt az új típust. VS 2008 látja. A 2.0-s mscorlib-ben látja. Bugos a reflector?

Régebbi kliensek szerintem byte[]-ként látják az DateTimeOffSet-et, de most nem tudom tesztelni.

Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.