In navolging van mijn vorige droevige verhaal aangaande het Entity Framewok -> LINQ -> SQL welke door bugs in SQL Server verschillende resultaten oplevert, nu een volgende:
Een tabel in SQL Server 2008 met DateTime velden wordt door dat idiote Entity Framework gevuld als zijnde DateTime2 velden. Dat hoeft heen probleem te zijn maar wat blijkt. De 'loss of precision' geeft bij een 'WHERE' clause door de afrondingsfouten geen of verkeerde waarden terug.
Wat gebeurt er:

Iemand die een mooie oplossing heeft of wordt het stomweg omzetten van DateTime velden naar DateTime2 in de database? If so, misschien dat bovenstaande een les/hulp kan zijn voor anderen...
Een tabel in SQL Server 2008 met DateTime velden wordt door dat idiote Entity Framework gevuld als zijnde DateTime2 velden. Dat hoeft heen probleem te zijn maar wat blijkt. De 'loss of precision' geeft bij een 'WHERE' clause door de afrondingsfouten geen of verkeerde waarden terug.
Wat gebeurt er:
- Maak een SQL 2008 DB met tabel met daarin 1 DateTime field. Maak een C# DateTime object met de waarde '2011-08-03 21:13:00.8258922' (== new DateTime(634480027808258922), de waarde in ticks)
- Gebruik het Entity Framework om een modelletje te maken van de DB en maak een programmaatje die de DateTime insert in de tabel.
- De SQL Query die het Entity Framework genereert zal hierop lijken:
code:1 2 3 4 5
exec sp_executesql N' INSERT [testtab] values (@0)', N'@0 datetime2(7)', @0='2011-08-03 21:13:00.8258922'
- In de database zie je nu de volgende DateTime verschijnen: 2011-08-03 21:13:00.827. Interessant: Een 7 en niet een 6 aan het eind?! Zal ook wel met de precision te maken hebben... En je ziet dus dat hij doodleuk een DateTime2 gaat inserten ook al in het veld van type DateTime.
- Maak een vergelijking in C# als: db.TestTable.Where(x=>x.mijnDate == new DateTime(634480027808258922). De SQL Query die hieruit rolt zal (sterk vereenvoudigd!) iets zijn als:
code:1 2 3 4 5 6 7
exec sp_executesql N' SELECT COUNT(*) FROM testtab WHERE testDateTime = @0', N'@0 datetime2(7)', @0='2011-08-03 21:13:00.8258922'
- Je verwacht ten minste 1 resultaat van je zojuist geinserte DateTime maar het resultaat van de count is altijd 0 omdat de meegegeven DateTime2(7) = 2011-08-03 21:13:00.8258922 en dat komt niet overeen met de in de tabel aanwezig zijnde 2011-08-03 21:13:00.827! En ook al doet het Entity Framework het fout en zou hij voor DateTime2(3) kiezen, dan nog werkt het niet want dan komt de afronding op .826 en in de DB staat inmiddels .827.
Iemand die een mooie oplossing heeft of wordt het stomweg omzetten van DateTime velden naar DateTime2 in de database? If so, misschien dat bovenstaande een les/hulp kan zijn voor anderen...