Newsgroup: it.comp.appl.access
Titolo: [BUG] data estesa e query between

Bug forse gią conosciuto, ma non per me.
Tabella con campo data generica (ggmmaaaa hh.mm.ss) se usata in una query 
con criterio between...and dą errore anche se il valore passato č una data 
in qualsiasi formato. L'errore č nel numero di record restituiti: non 
vengono restituiti i record con l'ultima data (and).
L'errore si ripete con tutti i tipi di formattazione della data passati al 
criterio.
Anche formattando il campo per la sola data (ggmmaaaa) č presente l'errore. 
Basta togliere ore, minuti e i secondi  e l'errore sparisce, ma non 
formattando il campo, bisogna proprio cancellarli.
Notizie?
Ciao, Carlo

 ha scritto nel messaggio
news:444395c4$0$36933$4faf...@reader3.news.tin.it...

Ciao Carlo,
a me funziona bene.
Potresti mostrare un esempio di date e come componi la Between ?
es.
----
Data
15/01/2006 18.30.45
15/01/2006 18.35.00
16/01/2006 14.50.00
18/01/2006 22.30.00
Query
SELECT *
FROM Tabella
WHERE Data Between #01/01/2006 00:00:00# And #01/18/2006 22:30:00#
----
In questo modo a me restistuisce tutti i 4 record.
Ciao
-- 
Giorgio Rancati
[Office Access MVP]

 [Office Access MVP]
Ciao Giorgio
SELECT *
FROM Tabella
WHERE Data Between #01/01/2006# And #01/18/2006#
Ciao, Carlo

 [Office Access MVP]
A mio avviso si tratta di un bug perchè se formatto una data generica del 
tipo 01/01/2006 01:34:21 in ggmmaaaa e se nei criteri uso #01/01/2006# deve 
restituire tutte le date scelte e questo lo fà. Ma se uso il between...and 
la data (and) viene esclusa a meno di non usare 23:59:59 insieme. Ti pare?
Ciao, Carlo 

 WHERE Data Between #01/01/2006# And #01/18/2006#
Ciao Carlo,
in questo modo è giusto che l'ultimo record non venga restituito.
Il valore 18/01/2006 22.30.00 è piu alto di 18/0/2006 00:00:00 quindi viene
escluso dal filtro.


 la data (and) viene esclusa a meno di non usare 23:59:59 insieme. Ti pare?
Ciao Carlo,
no, non mi pare :-)
La proprietà estesa *Format* di un campo esiste solo nei Db di Access e
viene presa in considerazione dalla sua interfaccia utente (l'applicazione
Access) quando deve visualizzare il dato, per tutti gli altri aspetti vale
il contenuto del campo, non la sua rappresentazione.
Prova ad aprire un recordset DAO o ADO, leggi un record e il relativo campo
data a cui hai dato la formattazione ggmmaaaa, vedrari che ti verrà
restituito con la parte ora inclusa.
Comunque è tutto scritto nell'help di Access, prova a cercare *Proprietà
Format (Formato)*, nelle note vi troverai
*La proprietà Format influenza solo il modo in cui i dati vengono
visualizzati, non la memorizzazione dei dati.*


 ha scritto nel 
messaggio news:4443c4e6$0$29096$5fc...@news.tiscali.it...

Sì, sì tutte cose risapute e ben digerite. Non è questo il caso.
Ci mancherebbe che il format mi modifichi il contenuto! Lo visualizzo 
(format) proprio a mio uso perchè come è memorizzato potrebbe non servirmi.
Qui la questione è un'altra: se cerchi solo la data (qualunque e in 
qualunque formato) tutto ok, se cerchi due date o intervallo di data no e 
questo non è comprensibile.
Se ne infischia delle ore se cerchi una data (come è giusto che sia), ma non 
fà lo stesso se cerchi un intervallo.
Nell'intervallo e, solo per la data finale, la data 01/01/2006 e 01/01/2006 
14:46:00 non sono uguali. Questo non è vero: la data è la stessa, nella 
seconda è stato "aggiunto" l'orario, ma il primo di gennaio è maledettamente 
identico e io quello voglio cercare, non mi interessa l'orario!
Il maledetto primo gennaio è fatto di 24 ore!
Ciao, Carlo 


Ovviamente non sono per nulla inc..to è solo un linguaggio all'americana!
Ciao, Carlo 

 Il maledetto primo gennaio è fatto di 24 ore!
Ciao Carlo,
il tipo di dato Data/Ora comprende sia la parte Data sia la parte Ora. Non
esiste una parte senza l'alta.
Quando inserisci nel filtro la sola parte data #01/01/2006# questa verrà
interpretata nella sua forma piena ovvero #01/01/2006 00:00:00#.
Quando inserisci nel filtro la sola parte ora #15:30:00# questo verrà
interpretata come #12/30/1899 15:30:00#
Per maggiori info sul tipo di dato Data/Ora guarda qui
----
Memorizzazione, calcolo e confronto di dati Data/ora in Microsoft Access
http://support.microsoft.com/kb/210276
----
Dove viene suggerito che per escludere la parte ora si può usare la funzione
Datevalue
es..
----
SELECT *
FROM 1_A
Where DateValue(Data) Between #01/01/2006# AND #01/18/2006#
 AND Data is not null
----
Ciao


 qualunque formato) tutto ok,
aspetta, questo non è vero :-)
se il tuo campo data contiene il valore #01/01/2006 15:30:00# e tu imposti
la Where con il filtro #01/01/2006#
----
Select *
From Tabella
Where Data=#01/01/2006#
----
Ti verranno rese solo le righe che hanno il campo data valorizzato con
#01/01/2006 00:00:00# escludendo quelle che contengono anche la parte ora.
Ciao


 ha scritto nel 
messaggio news:4443f5af$0$29111$5fc...@news.tiscali.it...

E' vero.
Prova a formattare il campo data estesa in ggmmaaaa e poi nel criterio usa 
pure #01/01/2006#...tutto funziona.
E' ESATTO...deve comportarsi così. Funziona anche con >=#01/01/2006# And 
<=#16/01/2006# o sue varianti.
E funziona perchè il filtro è applicato ad un campo formattato. Non così il 
between...lui non tiene conto della formattazione, anzi in questo caso va 
proprio in pallone con risultati assolutamente sballati.
Ciao, Carlo 

 proprio in pallone con risultati assolutamente sballati.
idem come sopra, i risultati sono coerenti con il filtro passato.
Se il filtro #01/01/2006# a te restituisce anche le date con la parte ora
diversa da 00:00:00, puň significare che forse hai una versione di Access
con un vecchio BUG, oppure, che il database č in uno stato di corruzione,
quindi la query restituisce valori incoerenti.
Che versione di Access stai usando ?


 ha scritto nel 
messaggio news:444419b4$0$29095$5fc...@news.tiscali.it...

Ciao Giorgio
piů di tutti i se e i ma facciamo una prova sul db reale.
Qui puoi scaricare un estratto con due query e una tabella:
http://www.frantoiogestione.com/Date.mdb
č in Axp e le due query funzionano perfettamente come ti avevo detto senza 
alcun errore.
Fammi sapere.
Ciao, Carlo 


ma LOL
si parlava di campo formattato di una tabella usato in una query (vedi tuo
primo post) e adesso spunta un campo calcolato :-)
----
SELECT Format([DataInizio],"dd/mm/yyyy") AS DataI
FROM Tabella
FROM SchedeKit
WHERE (((Format([DataInizio],"dd/mm/yyyy"))>=#1/1/2006# And
(Format([DataInizio],"dd/mm/yyyy"))<=#1/16/2006#) AND
((SchedeKit.Completa)=True))
ORDER BY Format([DataInizio],"dd/mm/yyyy");
----
In questo modo per forza che la parte ora non viene considerata, il campo
viene trasformato in stringa (te ne sarai accorto dall'ordinamento sballato)
nel formato dd/mm/yyyy dopo di ché costringi il motore del Db ad eseguire
una seconda conversione nel formato Data per il confronto con le costanti
della Where.
C'è una bella differenza dalla query su cui stavamo ragionando
----
SELECT *
FROM Tabella
WHERE Data Between #01/01/2006 00:00:00# And #01/18/2006 22:30:00#
----
:-)
vabbè, adesso che abbiamo una base comune su cui ragionare.
Quale è il problema ?


 una seconda conversione nel formato Data per il confronto con le costanti
scusa, qui č il contrario, costringi il motore del Db a convertire le
costanti in stringa per confrontarle con il risultato della format.
E' per questo che pur avendo un filtro cosě fatto *>=#01/01/2006# And
<=#16/01/2006#* ricevi anche i record con data *14/04/2006*
infatti la *Stringa* "14/04/2006" č piů bassa della *Stringa* "16/01/2006"


Ciao Giorgio
Nel primo post si parla esplicitamente di query anche se ammetto di non
essere stato chiarissimo.
Forse poteva aiutarti la frase: "Anche formattando il campo per la sola
data (ggmmaaaa) è presente l'errore".
Comunque questa l'istruzione che funziona:
SELECT SchedeKit.Ordine, SchedeKit.Kit, SchedeKit.DataInizio
FROM SchedeKit
WHERE (((SchedeKit.DataInizio)>=#1/1/2006# And
(SchedeKit.DataInizio)<=#1/16/2006#) AND ((SchedeKit.Completa)=True));
Ora per il usare il between passo il valore (di tipo date) di due
funzioni che a loro volta prelevano il valore da una maschera di
ricerca (DataDal e DataAl).
Questa l'istruzione:
SELECT SchedeKit.Ordine, SchedeKit.Kit, SchedeKit.DataInizio,
SchedeKit.DataFine
FROM SchedeKit
WHERE (((SchedeKit.DataInizio) Between DimmiDataSceltaTempiDal() And
DimmiDataSceltaTempial()) AND ((SchedeKit.Completa)=True));
Questa volta non funziona, nel senso che si mangia l'ultima data.
Queste le funzioni:
Public Function DimmiDataSceltaTempiDal() As Date
DimmiDataSceltaTempiDal = [Forms]![MSceltaTimbrature]![DataDal]
End Function
Public Function DimmiDataSceltaTempiAl() As Date
DimmiDataSceltaTempiAl = [Forms]![MSceltaTimbrature]![DataAl]
End Function
Ciao, Carlo

Sì certo.
Nel db che ti ho spedito ho usato il filtro nel campo sbagliato.
Leggi la risposta al post precedente dove ho corretto l'errore.
Ciao, Carlo

(SchedeKit.DataInizio)<=#1/16/2006#) AND ((SchedeKit.Completa)=True));
[CUT]
ho tagliato tutto il resto (che casomai vediamo in seguito) perchè la query
che hai postato a me rende il ruisultato corretto.
La query mi rende 51 record, queste date ..
----
16/01/2006 8.37.49
16/01/2006 8.57.15
16/01/2006 9.06.06
16/01/2006 10.45.08
16/01/2006 11.48.42
----
vengono giustamente escluse perchè maggiori di  16/01/2006 00:00:00
Ho provato la query con le versioni Acc97, Acc2002 e Acc2003 ottenendo
sempre lo stesso risultato.
Forse, come sospettavo, hai un BUG nella tua versione di Access.
Che versione usi ?
Quale Service Pack c'è applicato ?
Quale è la versione di Jet ?


cut
ho rimesso in linea il db con qualche esempio:
http://www.frantoiogestione.com/Date.mdb
Ciao, Carlo 

 
http://www.frantoiogestione.com/Date.mdb
ok,
e quale è il problema ?
Spero che tu non voglia paragonare un confronto tra due stringhe
----
WHERE (((Format([DataInizio],"dd/mm/yyyy"))=DimmiDataSceltaTempiDal()) AND
((SchedeKit.Completa)=True))
ORDER BY Format([DataInizio],"dd/mm/yyyy");
----
con un confronto tra due date
----
WHERE (((SchedeKit.DataInizio)=DimmiDataSceltaTempiDal()) AND
((SchedeKit.Completa)=True))
ORDER BY Format([DataInizio],"dd/mm/yyyy");
----
:-)


 Spero che tu non voglia paragonare un confronto tra due stringhe
cut
E invece de lo dico...ho mancato di trasformare il format in 
CDate...dimenticando che restituisce una stringa e non una data. Devo dire 
che mi ha tratto in inganno la posizione del testo nella colonna che è 
allineato a destra come una data e non a sinistra come un testo!
WHERE (((CDate(Format([DataInizio],"dd/mm/yyyy"))) Between 
DimmiDataSceltaTempiDal() And DimmiDataSceltaTempial()) AND 
((SchedeKit.Completa)=True))
ORDER BY CDate(Format([DataInizio],"dd/mm/yyyy"));
...funziona alla grande.
Questo era il risultato atteso...ma quando ci si fissa su qualcosa....
Grazie e alla prossima.
Ciao, Carlo 

 Grazie e alla prossima.
Ok,
:-)
se vuoi, prendi in esame anche questa forma
----
WHERE DateValue([DataInizio]) Between DimmiDataSceltaTempiDal() And
DimmiDataSceltaTempial()
    AND SchedeKit.Completa=True
   AND NOT DataInizio IS NULL
ORDER BY [DataInizio]
----
ti evita una doppia conversione.
