Handige query
By Ronald Kraijesteijn
Oplossing voor het tonen voor bijv. alle klanten waar de afgelopen 2 jaar geen zaken mee is gedaan, uitgaande van een integer als datumveld.
SELECT * FROM AANKOPEN
WHERE LaatsteAankoop <= (YEAR(DATEADD(yy, -2, GETDATE())) * 10000) + (MONTH(DATEADD(yy, -2, GETDATE())) * 100) + (DAY(DATEADD(yy, -2, GETDATE())))
8 Responses to Handige query
Kan je niet net zo goed het volgende statement gebruiken?
convert(varchar,dateadd(yy,-2, getdate()),112)
Dat truukje was mij nog niet bekend met 112. Heb je getest of de performance van het omzetten naar een integer op deze manier sneller is dan via mijn methode?
2 methode om een datetime om te zetten naar een integer zijn dus:
- SELECT CONVERT(VARCHAR, GETDATE() ,112)
- SELECT (YEAR(GETDATE()) * 10000) + (MONTH(GETDATE()) * 100) + (DAY(GETDATE()))
Hoi Ronald,
Ik heb snelheid niet getest. Kost in ieder geval minder typewerk :-)
Ik gebruik deze convert functie om de haverklap en nooit last van performance. Het is niet echt een trucje, maar gewoon een standaard functie in sql server om data om te smurfen naar tekst. Soortgelijk als de to_char functie in Oracle (al kan je daar gewoon met yyyymmdd het format opgeven). 112 staat daarbij gelijk aan yyyymmdd. Andere formats gebruiken andere codes. Kijk maar eens in de help van sql server onder "convert", staat een hele tabel met codes en het bijbehorende dataformat
Het is misschien minder typewerk maar een convert heeft in deze situatie een slechtere performance, vooral als je miljoenen rijen moet omzetten.
Goed, ik heb het nu getest op een tabel met 29 miljoen records. Beide queries zijn exact even snel (6 seconden). Waarom zou een convert minder snel moeten zijn?
Ik heb het net ook getest hier op een tabel met 2957897 records.
Jouw methode doet er 18sec over, die van mij 12 sec :-)
Aha, dus hoe meer records, des te sneller wordt mijn methode!
:-)
Dat truukje was mij nog niet bekend met 112.
Something to say?