All articles

Dátum levágása TSQL-ben

Published 2007-05-03 - Last modified 2007-05-03

Original: https://soci.hu/blog/index.php/2007/05/03/datum-levagasa-tsql-ben/

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?