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 il codice in basso:

  • nella prima query creiamo una tabella con una colonna di tipo datetime, costruita convertendo esplicitamente in datetime la data 1 gennaio 2019. Tale conversione ha l’effetto di aggiungere l’orario 00:00:00.000;
  • le due query in basso 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.

 

filtri sul campo datetime

Articoli correlati

Leggi come una clausola order by possa sorprendentemente migliorare le performance di una query.

Source