SQL Server: filtro su campi datetime

Quando scriviamo una query dobbiamo porre particolare attenzione se filtriamo i dati tramite campi di tipo datetime. Guardiamo ad esempio questo codice:

SELECT Convert(Datetime,’20190101′) as CampoDateTime INTO #test;

SELECT Count(*) FROM #test WHERE CampoDateTime <= ‘20181231 23:59:59.999’

SELECT Count(*) FROM #test WHERE CampoDateTime < ‘20190101’

Nella prima query creiamo una tabella con una colonna di tipo datetime, costruita convertendo esplicitamente in datetime una data. Tale conversione ha l’effetto di aggiungere l’orario 00:00:00.000;

Le due query successive restituiscono (probabilmente inaspettatamente) risultati differenti.

Infatti, se confrontato con un datetime, il valore ‘20181231 23:59:59.999‘ viene approssimato alla mezzanotte del 1 gennaio 2019 e di conseguenza risulta uguale al valore presente nella colonna. Nell’ultima query invece, stiamo considerando correttamente le righe con valori strettamente minore del 1 gennaio 2019.

Comprendere tale logica può risultare molto importante quando dobbiamo scrivere query per estrarre informazioni come “tutte le fatture del 2018“. Ricordiamo inoltre che è importante evitare, dove possibile, l’utilizzo di funzioni come Month e Year per risolvere tali richieste. Esse infatti potrebbero impattare negativamente le performance compromettendo l’utilizzo di eventuali indici.

Gli aspetti qui descritti fanno riferimento a un database SQL Server. In ambiente Oracle tale situazione merita ulteriori approfondimenti in quanto anche le colonne di tipo date (oltre al tipo datetime) memorizzano informazioni sull’ora, i minuti e i secondi.

 

Corsi correlati

Se cerchi un corso per fare un upgrade del tuo SQL e diventare un vero esperto leggi la scheda del nostro corso su SQL Server e il linguaggio T-SQL.

Torna su