Blupixel IT Blog – Articoli e Tutorial Informatica e Programmazione

Blog ufficiale di Blupixel IT Srl

Query SqlServer 2005 (MSSQL 2005) e SqlServer 2008 (MSSQL 2008) rispetto ad una data

Un problema in cui ci si imbatte spesso lavorando con Microsoft SQL Server (MSSQL) è la ricerca mediante corrispondenza della data.

Supponiamo infatti che abbiate un database con dei log (tabella “logs”) e dobbiate cercare tutti i risultati registrati in data 2 Ottobre 2011 (campo “log_data”).

In MySQL o PostgreSQL scrivereste semplicemente:

SELECT * FROM logs WHERE log_data = '2011-10-02'

Ma in MSSQL questo metodo non funziona!

Prima di vedere la stringa di ricerca funzionante sappiate che a seconda che voi usiate la versione MSSQL 2005 o MSSQL 2008 la stringa di ricerca deve variare. Questo perchè dalla versione 2008 è stato inserito anche il data type “DATE” che nella precedente versione, invece, non esisteva.

Quindi se doveste fare la stessa ricerca in Microsoft SQL Server 2005 dovrete scrivere:

SELECT * FROM logs WHERE REPLACE(CONVERT(VARCHAR, log_data, 102), ‘.’, ‘-’) = '2011-10-02'

mentre in Microsoft SQL Server 2008 basterà scrivere:

SELECT * FROM logs WHERE CONVERT(DATE, log_data) = '2011-10-02'

Mentre la seconda versione si spiega da sola (il contenuto del campo viene convertito in data prima di essere confrontato), la seconda necessita di qualche spiegazione in più.

Come potete vedere dalla tabella delle conversioni e casting del sito della microsoft http://msdn.microsoft.com/en-us/library/ms187928%28v=sql.90%29.aspx vi sono diversi modi di tradurre in una stringa le date.

Fra questi vediamo ad esempio

1 101 U.S. mm/dd/yyyy
2 102 ANSI yy.mm.dd
3 103 British/French dd/mm/yy
4 104 German dd.mm.yy
5 105 Italian dd-mm-yy

Il numero 102 con il convert che ho usato nella query, trasformerebbe la data nel formato 2011.10.02.
Volendo fare quindi il confronto direttamente con la data ’2011.10.02′ anzichè ’2011-10-02′ funzionerebbe già, ma per mantenerci nello standard delle date a cui siamo abituati (il trattino e non il punto), facciamo un replace (sostituzione) del punto con il trattino, così da ottenere esattamente il formato ’2011-10-02′ per fare il confronto.

A presto

Your email address will not be published. Required fields are marked *

*

uU4A

Please type the text above: