Ciao a tutti e ben rientrati dopo la pausa estiva! ;)
Come al solito, al rientro dalle vacanze si risolvono i problemi "semplici", giusto per riprendersi con un po' più di calma dal traumatico ritorno alla realtà! ;D
E anche qui in D'vel le cose non vanno diversamente! :)
Oggi infatti ho sistemato un problema relativo ad una query che, in una applicazione Swing un po' datata che abbiamo in piedi, non funzionava correttamente.
Il problema è semplice: ho un campo di tipo smalldatetime
che viene popolato con un default value che è getDate()
. Questo, ovviamente, stampa non solo il giorno ma anche l'ora, minuti, secondi e millisecondi all'interno del campo!
Da qui però il problema: quando fate una select su questa tabella e nella where mettete come condizione che la data dev'essere uguale ad un oggetto java.sql.Date
che voi gli passate da interfaccia, il simpatico SQL Server 2008 (la mia versione di riferimento su questo cliente..) considera anche la parte del timestamp. Risultato? Nessun record selezionato!
Chiedendo a Google come si potrebbe aggirare il problema, mi sono imbattuto in un simpatico thread su stackoverflow.comche, anche se da un altro punto di vista, affronta il tema.
Da qui la soluzione: anziché utilizzare la data in formato java.sql.Date come stavo fancendo, converto tutto quanto in una stringa e faccio l'uguaglianza, usando questo formato:
select
[campi]
from [tabella]
where 1 = 1
and DATEADD(dd, DATEDIFF(dd, 0,[campo di tipo smalldatetime]), 0) = ?
order by [order by]
Ovviamente al PreparedStatement
gli passerò la data in formato String
correttamente formattata per il Locale
del mio db! ;)
Spero vi possa essere d'aiuto e vi risparmi un po' di tempo!
Ovviamente, se qualcuno ha maggiore esperienza di me su questo topic e ha voglia di dare i suoi 2cent sul problema, ogni commento è più che ben accetto! ;)
Happy coding a tutti e, ancora, ben tornati alla realtà.. :)