[ sule99 @ 18.01.2011. 14:50 ] @
Pozdrav!

Zanima me da li neko može objasniti pojavu koju sam nedavno primjetio u SQL-u, a odnosi se na podatke tipa datetime i njihovo uspoređivanje.

primjer 1.

Code:
declare @d1 datetime
declare @d2 datetime

select    @d1 = '2010-01-01 00:00:00.002', @d2 = '2010-01-01 00:00:00.003'

if (@d1 = @d2)
select 'isto'
else
select 'nije isto'


Rezultat ovog upita je "isto"



primjer 2.

Code:
declare @d1 datetime
declare @d2 datetime

select    @d1 = '2010-01-01 00:00:00.004', @d2 = '2010-01-01 00:00:00.005'

if (@d1 = @d2)
select 'isto'
else
select 'nije isto'


rezultat je "nije isto"

Znači, kada se radi o razlici samo 1 milisekunde, nekada vraća da su podaci jednaki, a nekada da nisu jednaki. Slobodno probajte sa nekim drugim vrijednostima, bitno je samo da je razlika 1 milisekunda.
[ mmix @ 18.01.2011. 15:17 ] @
rezolucija datetime je 1/300 sekunde, zaokruzeno

dakle 0.000, 0.003, 0.007, 0.010, itd na osnovu 0.000, 0.00333333..., 0.0066666..., itd


kad parsira string, SQL zalepi na najblizu vrednost, pa je i 0.002 i 0.003 u stvarti isti datetime (.003) a 0.004 i 0.005 nije (jedan zalepi za 0.003 drugi za 0.007). Prosto ces to i sam videti sa select @d1, @d2
[ sule99 @ 19.01.2011. 07:33 ] @
Hvala na odgovoru, sad stvari postaju jasnije zašto u SQL 2008 ima novi tip podatka datetime2 koji ima veću točnost.
[ mmix @ 19.01.2011. 08:06 ] @
Pa, iskreno po mom licnom misljenju, mislim da je datetime2 uveden zbog ISO8601, da bi pokrili sve moguce oblike (zato i mozes da odredis broj deciamalnih mesta iza sekunde). U principu, ako ne pravis aplikaciju koja je toliko oesltljiva na milisekude i nize uopste ti nije ni potreban, sto dokazuje i broj aplikacija koje sasvim lepo rade sa datetime i bez 7 decimalnih mesta iza sekunde. Veci opseg i preciznost znaci i veci storage, i za podatke i za indexe, i znaci sporije izvrsavanje svih komparativnih operacija nad tipom.