Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Problemi con gli intervalli di date in Access 2000

95 views
Skip to first unread message

Giovanni Benedetti

unread,
May 22, 2006, 10:45:16 AM5/22/06
to
Salve,

devo estrarre un intervallo di date da un campo di una tabella in Access
2000.
Uso (semplificando):

sSQL = "SELECT campo_date FROM tabella "
sSQL = sSQL & "WHERE campo_date BETWEEN #" & data1 & "# AND #" & data2 & "#"

ma non mi estrae niente.
Uso MDAC 2.8.
Ho cambiato il formato di data ma non funziona lo stesso.
Se eseguo la query in Access funziona che č una meraviglia, se incollo e
correggo (virgolette) il codice generato da Access nello script ASP non
funziona piů di nuovo.
Qualcuno č a conoscenza di qualche bachetto di Access?

Grazie

ciao
Giovanni

Lorenzo Benaglia

unread,
May 22, 2006, 11:14:47 AM5/22/06
to
Giovanni Benedetti wrote:
> Ho cambiato il formato di data ma non funziona lo stesso.

Ciao Giovanni,

che formato hai utilizzato?
Generalmente con Access le date si specificano nel formato #mm/dd/yyyy#.

> Grazie
Prego.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org

Giovanni Benedetti

unread,
May 23, 2006, 9:05:13 AM5/23/06
to
Ciao Lorenzo,

scusa il ritardo nel rispondere.
Li ho provati un po' tutti, ma mi risponde cicca su tutti.
Per quel che ne so, lasciando vuoto il campo nelle proprietà prende le
impostazioni internazionali del PC impostate nel Pannello di controllo,
mentre scegliendo un formato si bypassa l'impostazione di default (si
personalizza).
Comunque non credo che sia quello il problema. Io credo che il problema sia
ADO (infatti, direttamente in Access funziona tutto).
La documentazione di Access dice di usare per gli intervalli di date delle
query con gli operatori "maggiore o uguale" e "minore o uguale", ossia:

sSQL = "SELECT campo_date FROM tabella "

sSQL = sSQL & "WHERE campo_date >= #" & data1 & "# AND campo_date <= #" &
data2 & "#"

anziché l'operatore BETWEEN. Ho provato anche così, ma niente da fare (tra
l'altro, BETWEEN usa un confronto migliore degli altri per le mie esigenze
perché non considera la parte dell'ora ma solo la data nel parametro che
viene passato in input).
Di nuovo, in Access funziona tutto, con ambedue le query, quindi non ottengo
informazioni supplementari all'interno di Access perché il problema non si
manifesta.
Per quel che ne so, ADO modifica di fatto le query che gli vengono passate
in input in base al provider a cui deve passarle (non esegue conversioni
automatiche di "dialetti" SQL, ma il wrapper "aggiusta" le query secondo un
suo standard interno a seconda del provider OLE DB a cui si interfaccia.
Secondo me è questo il problema.
Forse qualcuno è a conoscenza di questo problema e magari l'ha risolto
cambiando la stringa di connessione di ADO (magari collegandosi ad una
versione più recente del Jet di Access? Ho provato anche spostare il
database in Access 2003 e a usare il codice con il suo provider, ma niente
lo stesso. Sono bloccato.
Se usassi ODBC? Che ne pensate? E' un po' più lento della connessione
diretta ma potrebbe funzionare secondo voi?


Grazie a tutti per l'interessamento

ciao Lorenzo e grazie delle risposta

Ciao
Giovanni

Lorenzo Benaglia

unread,
May 23, 2006, 10:29:08 AM5/23/06
to
Giovanni Benedetti wrote:
> La documentazione di Access dice di usare per gli intervalli di date
> delle query con gli operatori "maggiore o uguale" e "minore o
> uguale", ossia:
> sSQL = "SELECT campo_date FROM tabella "
> sSQL = sSQL & "WHERE campo_date >= #" & data1 & "# AND campo_date <=
> #" & data2 & "#"
>
> anziché l'operatore BETWEEN.

Gulp? Questa è nuova :-D
L'operatore BETWEEN funziona più che bene restituendo le righe per le quali
la colonna campo_date è compresa tra i valori specificati (inclusi i valori
stessi).

> (tra l'altro, BETWEEN usa un confronto migliore degli altri per le
> mie esigenze perché non considera la parte dell'ora ma solo la data
> nel parametro che viene passato in input).

Non mi risulta dato che il data type Date/Time memorizza entrambe le
informazioni di data e di ora.
Partiamo con calma ragionando su un esempio concreto.
Definiamo nel database db1.mdf la tabella Students:

Field Name Data type
------------ ----------
StudentID AutoNumber
FirstName Text(10)
LastName Text(10)
InsertDate Date/Time

Popoliamola con le seguenti righe:

StudentID FirstName LastName InsertDate
---------- ---------- --------- --------------------
1 Lorenzo Benaglia 12/06/2005 12.33.04
2 Luca Bianchi 25/04/2005 6.18.37
3 Andrea Montanari 08/11/2005 21.45.56
4 Gianluca Hotz 16/05/2005 14.43.41

Definiamo la query parametrica qryGetStudents:

PARAMETERS [From] Date, [To] Date;
SELECT *
FROM Students
WHERE InsertDate BETWEEN [From] AND [To];

Richiamiamola da un client vbs valorizzando i parametri di input [From] e
[To] rispettivamente con le date 25/04/2005 6.00 e 12/06/2005 12.00
opportunamente formattate in base alle Regional Options (sul mio notebook ho
impostato il formato data italiano):

[BOF]
Dim cmd
Dim rs
Dim strOutput

Const CN_STRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=D:\documenti\db1.mdb"
Const adDate = 7
Const adCmdStoredProc = 4
Const adParamInput = 1

' Definisco un oggetto ADODB.Command
Set cmd = CreateObject("ADODB.Command")
With cmd
.CommandType = adCmdStoredProc
.CommandText = "qryGetStudents"
.Parameters.Append .CreateParameter("From", adDate, adParamInput, ,
"25/04/2005 6.00")
.Parameters.Append .CreateParameter("To", adDate, adParamInput, ,
"12/06/2005 12.00")
.ActiveConnection = CN_STRING

' Eseguo la stored procedure
Set rs = .Execute
End With

With rs
' Loop
Do Until .EOF
strOutput = "StudentID: " & .Fields("StudentID").Value & vbCrLf
strOutput = strOutput & "FirstName: " & .Fields("FirstName").Value &
vbCrLf
strOutput = strOutput & "LastName: " & .Fields("LastName").Value &
vbCrLf
strOutput = strOutput & "InsertDate: " & .Fields("InsertDate").Value
& vbCrLf

MsgBox strOutput, vbInformation

.MoveNext
Loop
End With

' Pulizia
rs.Close
Set rs = Nothing
Set cmd = Nothing

[EOF]

In output otterremo:

StudentID: 2
FirstName: Luca
LastName: Bianchi
InsertDate: 25/04/2005 6.18.37

StudentID: 4
FirstName: Gianluca
LastName: Hotz
InsertDate: 16/05/2005 14.43.41

Esattamente il risultato voluto in base ai parametri di input specificati
(ora compresa).

> ciao Lorenzo e grazie delle risposta

Giovanni Benedetti

unread,
May 23, 2006, 12:57:52 PM5/23/06
to
Ciao Lorenzo,

è tutto OK nel tuo codice perché usi l'oggetto Command e non l'oggetto
Recordset di ADO.
Con l'oggetto Command richiami una query in Access e gli passi i parametri,
quindi è Access che lavora e anche a me funziona così.
Io invece dovrei usare l'oggetto Recordset normalmente e non capisco perché
non mi debba dare il risultato corretto.
Devo usare il Recordset perché la stringa SQL parametrizzata viene costruita
al volo pescando il codice da un'altra tabella di Access che ne contiene
varie (circa un centinaio) e vengono ripescate a seconda della pagina ASP
che la richiede. Scrivere tante query in Access quante necessarie, diventa
un problema.

ciao
Giovanni

0 new messages