Newsgroup: it.comp.lang.delphi
Titolo: Date in SQL per Interbase

Al sodo:
Coqualcuno sa come si codificano le date negli statement SQL senza usare 
i parametri?
Io vorrei fare qualcosa come:
var
   lSql: TIBSQL;
   lDate: TDatetime;
   lID: integer;
begin
   ...
   lSql.SQL.Text := 'update MYTABLE set DATEFIELD='
               +DateToStr(lDate)+' where ID='+IntToStr(lID);
   lSql.Execute;
   ...
e usare i parametri mi da parecchio fastidio (l'SQL è costruita a pezzi 
in svariate procedure e gestirmi anche i parametri sarebbe un po' un 
casotto)
disgraziatamente quanto sopra NON funziona e non sono riuscito a trovare 
  è :
DATE 32 bits,signed 1 Jan 100 a.d. to 29 Feb 32768 a.d. ISC_DATE
Questo sembra indicare che devo fare qualcosa tipo:
...+IntToStr(DaysBetween(lDate, EncodeDateDay(100, 1))+...
È giusto???
Mi sembra pazzesco che non si possa scrivere la data in SQL in modo più 
"umano".
Dove sbaglio?
Grazie
ZioNemo

 i parametri?
Il formato stringa delle date dipende *strettamente* dal RDBMS utilizzato.
Molti accettano il formato YYYYMMDD, altri MMDDYYYY.
Non c'è un formato standard.
I parametri ti sollevano proprio dalla preoccupazione di capire quale
formato specifico utilizzare.

 i parametri?
In pratica, le date in uno statement SQL le puoi passare racchiudendole tra
apici:
	'update MYTABLE '
	'set DATEFIELD='''+DateToStr(lDate)+''' 
	'where ID='+IntToStr(lID);
Nello statement che avevi postato tu le date non venivano "rinchiuse" e
quindi Interbase si trovava a dover gestire ad esempio 31/12/2004 =
0,001289 :-((
Come ulteriore suggerimento, ti consiglierei infine di non scartare a
priori i Parameters: puoi comporre la query in questo modo:
	Query1.Close;
	Query1.SQL.Clear;
	Query1.SQL.Add('update MYTABLE');
	Query1.SQL.Add('   set CAMPO1 = :CAMPO1,');
	if condizione then
	begin
		Query1.SQL.Add('   CAMPO2 = :DATA');
		Query1.ParamByName('DATA').AsDateTime := lDate;
	end;
cioč valorizzando ogni parametro direttamente al momento dell'inserimento
nella query, piuttosto che aspettare di valorizzarli tutti insieme alla
fine, che ti imporrebbe di tener conto di quali hai introdotto nello
statement.
Saluti
	Marco Bortolani
	info @ 
marcobortolani.it

 i parametri?
'aaaa-mm-dd'
-- 
Alberto Salvati
An italian delphi developer that are studing c# & .Net

//modeot_on
allora c6, Andrea?
HowReYou? E' un pezzo che non ti si vedeva in giro...
//modeot_off


> allora c6, Andrea?
Sě e no, sono un pň impegnato col lavoro :-)

Ciao,
anche io in alcuni casi non uso i parametri ed utilizzo con soddisfazione 
la funzione FormatDate con mask 'yyyy-mm-dd'.
Ciao da Enrico Giudici.
ico...@tiscali.it
--- posted by geoForum on 
http://www.delphiedintorni.it


Grazie per la risposta.
Per ora ho risolto scrivendo una procedura apposita (dopo aver trovato 
la documentazione) che recita:
function encode_ib_date(aDate: TDateTime): string;
var
   D, M, Y: Word;
begin
   DecodeDate(aDate, Y, M, D);
   result := Format('%.4d-%.2d-%.2d', [Y, M, D]);
end;
e poi usando:
... + QuotedStr(encode_ib_date(mDate)) + ...
Comunque sono praticamente certo di aver provato ad usare sia il quoting 
che i parametri subito dopo la SQL.Add().
Entrambe non mi avevano funzionato (la prima credo per problemi di 
gg/mm/aaaa contro mm/dd/yyyy). Sei sicuro che sia lecito settare il 
parametro prima che la query sia finita? A me dava quasi sicuramente errore.
In particolare come gestisci
'insert into XXX (iData, Num) values (:DD ,77) where ID=33'
?? Io costruisco due stringhe con :
sN := 'iData, Num';
sV := '''1956-01-07'', 77'
e poi faccio:
SQL.Text := 'insert into XXX ('+sN+') values ('+sV+') where ID=33'
Con i parametri come faccio??
Grazie.
ZioNemo

 la documentazione) che recita:
Non è necessaria.  Esiste la FormatDateTime:
IBDate := FormatDateTime('yyymmdd', aDate);
p.s.: evita di "quotare" tutto il messaggio nelle risposte.

   result := Format('%.4d-%.2d-%.2d', [Y, M, D]);
Trovo assurdo che si perda + tempo a inventare la ruota che a vedere se 
la ruota esiste gia...
Sai della funzione FormatDateTime??
Con le tecnologie standard puoi usare i parametri solo per condizioni 
where e valori dei campi da assegnare, ma non puoi farlo nella select, 
cosa prevista ad esempio dai mitici DOA.
Inoltre, sarei curioso di sapere a cosa serve uno statement
"INSERT INTO MYTABLE VALUES( V1,V2) WHERE SOMEFIELD = XX"
e, sopratutto, da quali db è supportato.


priori i Parameters: puoi comporre la query in questo modo:
Se la query è costruita dinamicamente, ed è usata una volta sola, usare i
parametri non è un gran vantaggio, a parte la traduzione automatica del
formato.
I parametri permettono al server SQL di parsare il comando e stabilire
l'access plan una sola volta, e rieseguirlo poi più volte solo sostituendo
il valore dei parametri. Per questo motivo i parametri non possono essere
usati, ad esempio, per passare la lista dei campi o un'intera condizione
WHERE. Se il comando cambia , deve essere riparsato.
Luigi D. Sandon - D&amp;D Support Team
