Newsgroup: it.comp.lang.visual-basic
Titolo: [?] sql between non restituisce periodo corretto

ebbene non ho idea del perchè ho meglio mi sembra strano perchè ha sempre
funzionato (ho sempre usato lo stesso metodo ma non mi ritengo un genio
quindi....) ma questa istruzione basata su ado e database access in cui i
campi data sono campi testo
strSQL = "SELECT * FROM tabella WHERE Data BETWEEN '" & DTA_Inizio & "' AND
'" & DTA_Fine & "'"
non restituisce il periodo indicato ad esempio se inizio e fine sono
07/05/2003 e 10/05/2003 mi restituisce 07/12/2003 che mi sta succedendo ?
Daniele
Approfitto per ringraziare il gruppo sempre celere nei consigli e/o
soluzioni grazie ancora

 07/05/2003 e 10/05/2003 mi restituisce 07/12/2003 che mi sta succedendo ?
Metti le date nella forma #MM/GG/AAAA#, senza apicini e usando, comunque, le
/ come separatori


grazie ora funziona ma non ho dovuto trasformare la data nel formato che mi
dici potrei incorrere in problemi ti ricordo che i campi nel db sono testo
non data c'entra qualcosa ?

*Dani* ha scritto:

Se sono testo li avrai scritti in qualche modo/formato. Fai molta attenzione
allo stesso perchè se non è "AAAAMMGG" non potrai mai avere la garanzia che
un confronto per "valori" di stringhe minori/maggiori funzioni... Certo non
funziona se è GG/MM/AAAA

*Lupo* aggiunge:
Per meglio spiegare quel che intendevo:
La stringa "07/12/2003" è maggiore della stringa "07/05/2003" ed è minore
della stringa "10/05/2003"
Mentre
La stringa "20031207" è maggiore della stringa "20030507" ed è maggiore
della stringa "20030510"


Si è vero ricordo il discorso sulla base di campo data in msdn dicevano di
utilizzare il formato mm/dd/yyyy io comunque ho formattato tutte le stringhe
in dd/mm/yyyy e dopo aver fatto diverse prove sembra funzionare
correttamente. Sicuramente è un prg che potrà funzionare correttamente solo
in italia e su PC con le impostazioni internazionali di data e numeri su
base italiana ma si ferma lì (ma mi basta).
Grazie Lupo
Dani

*Dani* ha scritto:

Insomma: Campo di tipo DATA o campo di tipo TESTO? Sono molto diversi, il
primo è un numero, il secondo una stringa di caratteri. Se, come hai voluto
prima specificare, i tuoi sono campi testo, il formato GG/MM/AAAA non potrà
mai funzionare (o, se preferisci, non potrà sempre funzionare) nei confronti
per maggiore/minore, ma solo per uguale.
Rileggi il tutto.


OK per avere la garanzia assoluta che il between funzioni sempre devo
trasformare il campo che contiene la data in un campo DATA questo è quanto
(peccato adesso mi devo gestire  e trasformare tutti gli inserimenti data
che palle).
Grazie
Daniele

*Dani* ha scritto:

Io non ho mai detto questo (tant'è che, dove posso, sego di brutto tutti i
campi data e li metto testo). Io ho detto che se i tuoi campi "data" sono in
effetti dei campi testo (come hai specificato), il loro formato deve (!)
essere "AAAAMMGG", nessun altro.

 essere "AAAAMMGG", nessun altro.
Beh questo mi rallegra non poco bastera fare un parserino che modifichi
l'input utente da dd/mm/yyyy a yyyy/mm/dd non dovrebbe essere complicato ci
provo grazie. (anche se continuo a non capire perchè dopo aver messo #
all'inizio e alla fine della data nella sql al posto degli apicini dopo
svariate prove continua ad andare.

 svariate prove continua ad andare.
Getto la spugna! Nel mio ultimo anelito, aggiungo che NON devi cambiare il
formato di input, ma solo il formato della stringa che vai a salvare...
ovvero "AAAAMMGG"
Per il cancelletto (#) dico, anzi, urlo, NOOOOO!!!
Se hai aggiunto solo i due # in testa e in coda (togliendo gli apicini),
salvo conversioni implicite di VB/Jet da stringa a "virtual-data" (cosa
molto probabile, visto che sono due donnine mooolto generose e per questo
vizianti), a parità di date non funzionanti, doveva continuare a ... non
funzionare.


Io invece mi getto il cervello oppure mi getto il computer perchè ho provato
ancora prima di leggere il tuo post e con la forma dd/mm/yyyy e usando il
cancelletto così:   where data between #21/05/2003# and #25/05/2003#
funziona perfettamente ma è proprio per questo che non ti riesco a capire
perdonami. Aspetta aspetta ti dico ancora due cose non uso odbc ma uso ado
con un provider  Microsoft.Jet.OLEDB.4.0 magari può essere utile

> con un provider  Microsoft.Jet.OLEDB.4.0 magari puň essere utile
e aggiungo che davanti a quello c'č un'altro provider di nome MSDatashape
e altro non sň

 e altro non sò
Eccolo, un altro Data_qualcosa...

 where data between #21/05/2003# and #03/06/2003#
Quale delle due stringhe (ho detto stringhe, non date!) è maggiore?

> where data between '21/05/2003' and '03/06/2003'

Ok ci provo e domani mattina ti so dire ora sono fuso
Ciao
Dani

Allora inserito le date 20/05, 21/05, 22/05, 02/06, 03/06 e 04/06
mantendendo
lo stesso metodo di acquisizione/deposito e senza cambiare il campo testo
della data del
db access 2000 in campi data
PORCA MISERIACCIA è VERO mi va tutto a farsi friggere
ho provato con formato stringa dd/mm/yyyy poi attraverso il
format(stringa,"yyyy/mm/dd")
perchè il AAAA/MM/GG mi dava un errore di sintassi
ho composto il between che quindi diventa where data between '2003/05/21'
and '2003/06/03'
e sia che utilizzo gli apicini o il cancelletto il risultato non cambia mi
dà sempre un valore
errato ma cambiando il campo del db da testo a data con formato dd/mm/yyyy,
così da esporlo
senza conversioni, e utilizzando una formattazione in yyyy/mm/dd il between
funziona correttamente
esempio i dati sono 20/05/2003, 21/05/2003, 22/05/2003, 02/06/2003,
03/06/2003 e 04/06/2003
il campo in access è data e formato dd/mm/yyyy
prelevo le date per il periodo da MonthView e le formatto
format(MonthView1.Value,"yyyy/mm/dd") e
format(MonthView2.Value,"yyyy/mm/dd")
il range allora è where data between #2003/05/21# and #2003/06/03# bene il
risultato è corretto
il numero di record restituito è 4  e mi restituisce 6 se seleziono
2003/05/20 and 2003/06/04
allora ci sono ? è tutto ok o mi devo aspettare altre sorprese ?
Dani

*Dani* ha scritto:


 allora ci sono ? è tutto ok o mi devo aspettare altre sorprese ?
Riepiloghiamo (perchè non ho ben capito tutto quello che hai scritto):
*** Se il tipo di campo del database è ti tipo Data:
Nell'assegnazione del campo (scrittura) personalmente uso sempre e solo
DateSerial(anno, mese, giorno)
I comandi SQL per Access pretendono che le date nei comandi stessi vengano
espresse nel formato ##MM/GG/AAAA# (sempre con le / e senza apicini)
*** Se il tipo di campo del database  è di tipo Testo:
Il formato che garantisce l'ordinamento e i confronti è "AAAAMMGG". Puoi, se
vuoi, metterci anche le barre o dei separatori (sempre gli stessi), ma non è
affatto necessario
Nei comandi SQL i campi vengono trattati come normali campi testo per il
loro valore, quindi fra apicini e nel formato detto (AAAAMMGG)

e comunque adesso non mi funziona l'insert into tabella (data) values ('" &
data &"') e data in qualsiasi formato ma se lo cambio in variabile date ?
che casini ho ?

*Dani* ha scritto:

Con il campo "data" in formato testo? La Insert deve funzionare in ogni
caso. Verifica di non inserire più caratteri di quanti previsti per il
campo.
Se vuoi usare i campi di tipo data, ma vedi il post di prima.


Allora nel db ho impostato il campo come data è il formato (da access 2000)
Data in cifre (31/12/2003)
per inserirlo con insert into o fare l'update con update tabella set uso una
stringa di testo che passo alla stringa
sql senza apicini o cancelletto
imposto il formato della cella della datagrid come data in cifre ( formato
31/12/2003) così mi si visualizza giusta
per il between prelevo da monthview la data e la formatto con format
2003/12/31 la passo alla between come stringa
ma utilizzo il cancelletto between #" & dataStringa1 & "# AND #" &
dataStringa2 &"# .... eventuali altri and per ulteriore filtraggio
dove dataStringa1 < dataStringa2 ora il numero di record restituiti è giusto
anche utilizzando periodi con diversi mesi o anni
boh !?!! pensi che vada bene ? per adesso sembra di si. non è che non voglio
utilizzare il tuo sistema che senz'altro sarà valido ma
mi tocca rivedere un bel pò di codice

 dataStringa2 &"# ....
Sě, va bene anche questa, anche se il "classico" per Access direbbe
#MM/GG/AAAA#
Al limite fai altre prove (per convincerti e poi scegliere), visto che la
stringa per il comando SQL la devi comunque formattare...


ok apporto cmq una correzione a quanto elencato nel mio prec. post a
riguardo della sql update nella stringa devo usare l'apicino per passargli
la data altrimenti viene impostata al 1989. Per il resto va bene
Voglio ringraziarti per avermi seguito cosě assiduamente e avermi risolto i
vari problemi.
Ciao a buon rendere.
Dani