Egyik MSHU-s jóakaróm jóvoltából megkaptam a teljes Inside TSQL 2005 sorozatot, és még jó pár egyéb könyvet is.
Az első részen, a Storage Engine részen már túlvagyok, sok érdekes dolgot olvastam benne, amelyeket majd egyik kevésbé rohanós pillanatomban összeszedek címszavakban.
Csak egyet emelnék ki. 2005-ben NEM a tranzakciós logból állítják elő a triggerek számára az inserted és deleted táblákat, hanem a snapshot isolationhöz kidolgozott row versioning eljárással. Na, ez pl. nekem új volt.
No, amit viszont most szeretnék bemutatni a TSQL Programing c. második kötetből, hogy egy időpontot is tartalmazó dátumról hogyan lehet hatékonyan levágni az idő részt (ha már egyszer nincs rendes date és time típus):
dateadd(d, 0, datediff(d, 0, getdate()))
Ügyes, ezt még nem láttam.
Én ezt ismertem, ez is benne van a könyvben:
cast(convert(varchar(8), getdate(), 112) as datetime)
Ezzel viszont már szívtam, mert itt ugye arra bazírozunk, hogy levágódik az idő rész a varchar hossza miatt, ez viszont egyes esetekben kiborítja a szervert. Asszem indexelt, számított oszlopban akartam ezt használni, de nem engedte, a túlcsordulás miatt. Mellesleg az első verzió szerintem sokkal gyorsabb.
Nem álltam meg, megmértem őket:
[source:SQL]
declare @i int, @e int
set @i = 0
set @e = 1000000
declare @start datetime
declare @end datetime
declare @d datetime
set @start = getdate()
while(@i < @e)
begin
–set @d = dateadd(d, 0, datediff(d, 0, getdate()))
set @d = cast(convert(varchar(8), getdate(), 112) as datetime)
set @i = @i + 1
end
set @end = getdate()
select datediff(ms, @start, @end)
[/source]
Az első verzió nálam kb. 1300 ms alatt fut le, a második 2000 körül. Nem óriási a különbség, de a stringes megoldás hibás viselkedése miatt most már inkább az elsőt preferálom.
Van jobb megoldás esetleg?