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.