Newsgroup: it.comp.lang.delphi
Titolo: Problemi con le DATE

Ciao a tutti,
Lavoro con SQL Server 2005 e Delphi 7.
Ho questo problema: il formato della data č mm/dd/yyyy. 
Se inserisco i dati in quel modo poi tutto funziona correttamente con
filtri, query, ecc. ma io vorrei il formato italiano dd/mm/yyyy.
Ho cambiato il campo DisplayFormat dei campi persistenti ed in
visualizzazione tutto č tornato a posto ma al momento dell'inserimento
avevo il problema che lui si aspettava prima il mese poi il giorno.
Ho cambiato quindi le impostazioni di windows dal pannello di
controllo.
Ora anche l'inserimento č OK, ma permane il problema quando apro le
query che filtrano per data in quanto il formato per il DB Engine
sembra essere rimasto quello precedente. 
La clausola where della mia ADoquery la compongo in piů passi e la
parte relativa alla data č la seguente: 
sWhere := sWhere + ' AND gps_date >= ' +
QuotedStr(DateToStr(dtpDateStart.Date)) + ' AND gps_date <= ' +
QuotedStr(DateToStr(dtpDateStop.Date));
dtpDateStart e dtpDateStop sono due datetimepicker.
l'SQL risultante č quindi 
gps_date >= '23/07/2007' AND gps_date <= '23/07/2007'
e la cosa assolutamente non piace ad SQL Server. Ho provato anche
dallo strumento Management Studio e lui vuole la data come 07/23/2007
Come ne vengo fuori?
Sono veramente costretto a scrivere una funzione che mi restituisce
sempre e comunque il formato mm/dd/yyyy da passare ad SQL Server o
sbaglio io qualcosa?
Grazie

 parte relativa alla data è la seguente: 
Sbagli, devi usare i parametri. Sono le regole base per chi lavora con SQL
contenente date e stringhe. I parametri risolvono le questioni legate alle
singole convenzioni di ogni DB, perché semplicemente affidano le rogne al
driver di basso livello.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 gps_date >= '23/07/2007' AND gps_date <= '23/07/2007'
Usa i parametri! (soluzione migliore)
Prova #23/07/2007# (soluzione (?) peggiore)
-- 
Jax

driver di basso livello.
Ho sempre lavorato con i database da autodidatta e mai per
applicazioni commerciali. Sviluppo codice solo per me stesso.
Uso i parametri in genere solo quando ho delle ADOQuery "statiche"
mentre per solito compongo l'SQL a runtime per quelle dinamiche senza
parametri perchè non ho mai pensato a questa problematica.
Il vostro consiglio (Andrea e Jax) è molto utile.
GRAZIE MILLE

Ciao!
A beneficio di chi leggesse il thread riporto la soluzione indicata
 sWhere := sWhere + ' AND gps_date >= :dtstart AND gps_date <=
:dtend';
  If Copy(sWhere,1,5)=' AND ' Then sWhere := Copy( sWhere, 6,
Length(sWhere)-5 );
  If sWhere<>'' Then sWhere := ' WHERE ' + sWhere;
  DM.qGps.Close;
  DM.qGps.SQL.Clear;
  DM.qGps.SQL.Add( 'SELECT * FROM tabGPS' + sWhere );
  DM.qGps.Parameters.ParamByName('dtstart').Value :=
DateToStr(dtpDateStart.Date);
  DM.qGps.Parameters.ParamByName('dtend').Value :=
DateToStr(dtpDateEnd.Date);
  DM.qGps.Open;
Cosě facendo la query "funziona" indipendentemente dalle opzioni
internazionali configurate nel pannello di controllo. Quindi io a
video imposto 23/07/2007 come data e tutto funziona sia con la
convenzione inglese che italiana.
Ora perň rimane un problema: in fase di inserimento ho che le DBEdit
che mostrano 23/07/2007 al momento in cui mi ci sposto sopra invertono
i primi due numeri mostrando 07/23/2007 oppure se in inserimento
digito 08/07/2007 per lui č il 7 agosto e non l'8 luglio!
Come si risolve questo problema?
Grazie

 DateToStr(dtpDateStart.Date);
Non c'è bisogno di queste trasformazioni intermedie: basta usare
AsDateTime e assegnare direttamente dtpDateStart.Date.
Attenzione al fatto che i DateTimePicker conservano anche l'ora nel
valore, quindi è sempre bene fare un Int().


valore, quindi è sempre bene fare un Int().
Se non fraintendo mi suggerisci di scrivere
DM.qGps.Parameters.ParamByName('dtstart').AsDateTime :=
Int(dtpDateStart.DCate);
Mi indica Undeclared Identifier riferito ad AsDateTime.
Ho frainteso io?