A .NET CLR és az SQL Server dátumok tárolására képes adattípusainak értékkészlete nem egyezik meg. "Normál" esetben - mondjuk ha az elmúlt 50 évtől a következő 50 évig terjedő időintervallumba eső dátumokkal dolgozunk -, ez nem sok vizet zavar, a konverzió is legtöbbször automatikus, észre sem veszük. Néhány esetben azonban, például ha nagyon finom granulációra, vagy ennél távolabbi dátumok kezeléséra van szükségünk, könnyen problémákba ütközhetünk.
Így járhatunk például, ha valami valamilyen speciális esetet valamilyen kitűntetett dátummal szeretnénk jelezni - pl. ha meg kell mondanunk, hogy egy adat mikortól érvényes, de vannak olyan adataink amik mindig is érvényesek voltak a múltban, a DataTime.MinValue ideális választás. Legalábbis addig, amíg nem szeretnénk ezt le is tárolni, az SQL Server datetime típusa ugyanis csak 1753 január 1. utáni dátumokat képes kezelni (hogy miért, arról már korábban írtam).
Szerencsére erre is van megoldás, a System.Data.SqlTypes névtér alatt lakó SqlDateTime osztály (pontosabban struct) személyében (az alábbi kód 1753. január 1., 00:00:00-át, illetve 9999. december 31., 23:59:59-et ír ki a konzolra):
Console.WriteLine(SqlDateTime.MinValue.Value); Console.WriteLine(SqlDateTime.MaxValue.Value);
Most azonban megállt a tudomány: az adatbázisban egy smalldatetime-ként reprezentált értéket kéne hasonlóképp kezelnem (az adott szituációban sokat számít, hogy a smalldatetime csak 4 byteot foglal a datetime 8-ával szemben). Az msdn azt mondja, hogy a smalldatetime típust is, akárcsak a datetime-ot, az SqlDateTime osztály kezeli. Rajta azonban nincs olyan property, ami a smalldatetime Min- és MaxValue-ját adná vissza.
Tud valaki ilyenről?
A probléma persze nem kritikus, nem túl megerőltető egy hasonló funkcionalitás "kézzel" való legyártása, csak még se olyan elegáns (viszont jó téma egy blogposzthoz).
Jó tudni továbbá (bár nekem most jelen esetben szintén nem opció), hogy az SQL Server 2008 számos új adattípust vezetett be, köztük az időkezeléssel kapcsolatos date, time, datetime2, datetimeoffset típusokat - ha új projektbe kezdünk, és van szerencsénk az újabb platformot használni, érdemes egy pillantást vetni rájuk.

0 megjegyzés:
Megjegyzés küldése