Newsgroup: it.comp.lang.visual-basic
Titolo: problema SQL

Salve,
ho il seguente problema con l' SQL:
all'interno di una query devo sottrarre 6 mesi ad una data.
Aiuto!!!
Ciao


Ciao Luigi,
per rispondere adeguatamente alla tua domanda occorre conoscere con quale
RDBMS stai lavorando.
Ti riporto un paio di soluzioni valide per Access e SQL Server che si basano
sulla tabella Employees del database Northwind.
Jet SQL (Access)
----------------
SELECT FirstName, BirthDate, DateAdd("m", -6, BirthDate) AS NewDate
FROM Employees;
Output:
FirstName  BirthDate   NewDate
---------- ----------- -----------
Nancy      08/12/1948  08/06/1948
Andrew     19/02/1952  19/08/1951
Janet      30/08/1963  28/02/1963
Margaret   19/09/1937  19/03/1937
Steven     04/03/1955  04/09/1954
Michael    02/07/1963  02/01/1963
Robert     29/05/1960  29/11/1959
Laura      09/01/1958  09/07/1957
Anne       27/01/1966  27/07/1965
Transact SQL (SQL Server)
-------------------------
USE Northwind
GO
/* Query */
SELECT FirstName, BirthDate, DATEADD(m, -6, BirthDate) AS NewDate
FROM dbo.Employees
GO
/* Output:
FirstName  BirthDate                NewDate
---------- ------------------------ ------------------------
Nancy      1948-12-08 00:00:00.000  1948-06-08 00:00:00.000
Andrew     1952-02-19 00:00:00.000  1951-08-19 00:00:00.000
Janet      1963-08-30 00:00:00.000  1963-02-28 00:00:00.000
Margaret   1937-09-19 00:00:00.000  1937-03-19 00:00:00.000
Steven     1955-03-04 00:00:00.000  1954-09-04 00:00:00.000
Michael    1963-07-02 00:00:00.000  1963-01-02 00:00:00.000
Robert     1960-05-29 00:00:00.000  1959-11-29 00:00:00.000
Laura      1958-01-09 00:00:00.000  1957-07-09 00:00:00.000
Anne       1966-01-27 00:00:00.000  1965-07-27 00:00:00.000
(9 row(s) affected)
*/
Ciao!
-- 
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://mvp.support.microsoft.com
http://italy.mvps.org

 ha scritto nel messaggio
news:borkrm$1ib5s5$1...@ID-154627.news.uni-berlin.de...


 Grazie,
Prego.


 ha scritto nel messaggio
news:bovn7j$1intrk$1...@ID-154627.news.uni-berlin.de...


 contiene le scadenza annuali.
Ciao Luigi,
non puoi utilizzare gli alias nella clausola WHERE.
Prova a modificare la query nel seguente modo:
SELECT DateAdd("m",-6,Polizze.Scadenza) AS Sem, *
FROM Utenti INNER JOIN Polizze
ON Utenti.ID=Polizze.UtenteID
WHERE (Polizze.Scadenza Between [Data Inizio Ricerca] And [Data Fine
Ricerca])
OR (Polizze.Semestrale=True
AND DateAdd("m",-6,Polizze.Scadenza) Between [Data Inizio Ricerca] And [Data
Fine Ricerca]);


 Fine Ricerca]);
Ebbene ci ho provato ma non so perchč non funziona, o meglio funziona ma mi
restituisce risultati fuori dagli estremi della ricerca... non so perchč!
Saluti

 so perchč!
intravvedo un problema sul formato delle date...
--
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 Saluti


 Fine Ricerca]) OR (Polizze.Semestrale=True AND


 risultato che vuoi ottenere.
Ok, ti posso dare tutte le info che vuoi, ma sto usando Access. Ti posti il
file in privato?
[data inzio ricerca] e [data inzio ricerca] sono gli estremi della ricerca
che devono essere inseriti dall'utente.
saluti,
Luigi

 ricerca che devono essere inseriti dall'utente.
Ci dici, per favore, in che formato vengono inseriti tali estremi della
ricerca e come costruisci la stringa/query da eseguire? Per favore...

 posti il file in privato?
Ciao Luigi,
se vuoi mandami l'mdb via mail (compresso in formato .zip) specificando in
modo chiaro il risultato che vuoi ottenere: con [data inzio ricerca] = x e
[data inzio ricerca] = y voglio ottenenere il seguente result set:
Colonna1  Colonna2 ... Colonnan
--------- ---------    ---------
aaaaaaa   bbbbbb       cccccccc
...
xxxxxxx   yyyyyy       zzzzzzzz
OK?
Se riuscirò a risolvere il problema, provvederò a postare la risposta su
questo ng.


 ricerca e come costruisci la stringa/query da eseguire? Per favore...
Gli estremi sono inseriti dall'utente attraverso una finestra. Il loro
formato è gg/mm/aa.
Ciao

[*Luigi B* = del...@NSinwind.it in
news:gL0vb.129248$
vO5.5...@twister1.libero.it
] ha scritto:

Access vuole #MM/GG/AAAA#

 intravvedo un problema sul formato delle date...
la sfera di cristallo ha colpito ancora :-)


 la sfera di cristallo ha colpito ancora :-)
Già, almeno credo.
Dici che con questo tipo di "real-time" sapremo mai qual era il problema?
... :-(

 problema? ... :-(
Ciao Lupo (e ciao a tutti i lettori di questo thread infinito :-) ),
Luigi mi ha contattato in privato spedendomi l'mdb.
Il formato delle tabelle Utenti e Polizze non è significativo per il
problema segnalato, basta sapere che sono in relazione 1 a molti.
La colonna Polizze.Semestrale è definita come Yes/No (bit) e
Polizze.Scadenza come Date/Time.
Questa è la query di Luigi:
SELECT *
FROM Utenti INNER JOIN Polizze ON Utenti.ID=Polizze.UtenteID
WHERE ((Polizze.Scadenza Between [Data Inizio Ricerca] And [Data Fine
Ricerca]) Or (Polizze.Semestrale=True And DateAdd("m",-6,Polizze.Scadenza)
Between [Data Inizio Ricerca] And [Data Fine Ricerca]));
Queste sono 2 queries che ho scritto e logicamente "dovrebbero" essere
analoghe alla precedente:
PARAMETERS [Data Inizio Ricerca] Date, [Data Fine Ricerca] Date;
SELECT P.*
FROM Utenti AS U INNER JOIN Polizze AS P
ON 
U.ID
=P.UtenteID
WHERE  (P.Scadenza BETWEEN [Data Inizio Ricerca] AND [Data Fine Ricerca])
OR (P.Semestrale=True AND P.Scadenza BETWEEN DateAdd("m", 6,[Data Inizio
Ricerca]) AND DateAdd("m", 6,[Data Fine Ricerca]));
PARAMETERS [Data Inizio Ricerca] Date, [Data Fine Ricerca] Date;
SELECT P.*
FROM Utenti AS U INNER JOIN Polizze AS P
ON 
U.ID
=P.UtenteID
WHERE  P.Scadenza BETWEEN [Data Inizio Ricerca] AND [Data Fine Ricerca]
UNION
SELECT P.*
FROM Utenti AS U INNER JOIN Polizze AS P
ON 
U.ID
=P.UtenteID
WHERE P.Semestrale=True
AND P.Scadenza BETWEEN DateAdd("m", 6,[Data Inizio Ricerca]) AND
DateAdd("m", 6,[Data Fine Ricerca]);
Le mie queries restituiscono il risultato che Luigi si aspetta, mentre la
sua no.
Aggiungendo la dichiarazione dei parametri specificando il corretto data
type, ottengo il risultato desiderato:
PARAMETERS [Data Inizio Ricerca] DateTime, [Data Fine Ricerca] DateTime;
SELECT *
FROM Utenti INNER JOIN Polizze ON [Utenti].[ID]=[Polizze].[UtenteID]
WHERE (([Polizze].[Scadenza] Between [Data Inizio Ricerca] And [Data Fine
Ricerca]) Or ([Polizze].[Semestrale]=True And
DateAdd("m",-6,[Polizze].[Scadenza]) Between [Data Inizio Ricerca] And [Data
Fine Ricerca]));
Ciao!


 And [Data Fine Ricerca]));
Mi torna. Evidentemente la dichiarazione del tipo rende il confronto delle
date limite (parametri di input) compatibile con i valori (e i tipi)
contenuti nel database. Credo che tutto, appunto, sia quindi riconducibile a
formati di passaggio dei dati. Passare un parametro di tipo "DateTime" o
passare #11/20/2003# sono cose analoghe.

 ... :-(
Lupo,
non ti incavolare, io "programmo" (... e non ad alto livello) per hobbies,
il giorno faccio tutto un altro lavoro.
Comunque grazie x l'attenzione.
Ciao,
Luigi

 Fine Ricerca]));
Che fregatura! La definizione dei parametri!
Ciao,
Luigi

 Luigi

 mia "vena polemica".
Ok, la prossima volta cercherò di essere più chiaro e sollecito.
Cmq grazie dell'interessamento,
Ciao

 nessuna ironia solo che non so come altro chiamarti
LOL, ero io che specificavo di non intendere le _mie_ parole come ironiche.
Mi chiamo Luigi e "giocavo" sul nostro nome.


ahhhhhh! Scusa!