[Risolto] Filtro per data inferiore o uguale

di il
5 risposte

[Risolto] Filtro per data inferiore o uguale

Buongiorno.

Sto diventando matto con il confronto delle date in un modulo VBA, ma forse sto diventando vecchio e mi sto perdendo qualcosa.

Uso un database SQL server, ma l'applicazione è MsAccess.

Nel database ho una tabella che si chiama Matricole. 

In Access estraggo per mezzo di una query che chiamo QryMatricoleCollaudate alcuni campi della tabella Matricole

SELECT Matricole.ID_Operatore, Matricole.ID_Matricola, Matricole.NumeroMatricola, Matricole.DataInizioCollaudo, Matricole.DataFineCollaudo, Matricole.TempoCollaudo, Matricole.TempoAttesaCollaudo
FROM Matricole
WHERE (((Matricole.ID_Operatore)>0) 
AND ((Matricole.DataInizioCollaudo) Is Not Null) 
AND ((Matricole.DataFineCollaudo) Is Not Null))
ORDER BY Matricole.ID_Operatore, Matricole.DataFineCollaudo DESC;

La query ovviamente mi mostra i dati corretti. Sia DataInizioCollaudo che DataFineCollaudo sono definite Datetime (Data+Ora).

All'interno del modulo per elaborare i dati che mi servono ho il seguente codice

    strSQL = "SELECT * FROM QryMatricoleCollaudate WHERE ID_Matricola = " & ID_Matricola
    Set rsMatr = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges)
    If rsMatr.EOF = False Then
        
        strSQL = "SELECT * FROM QryMatricoleCollaudate "
        strSQL = strSQL & " WHERE ID_Operatore = " & rsMatr!ID_Operatore
        strSQL = strSQL & "   AND ID_Matricola <> " & rsMatr!ID_Matricola
        strSQL = strSQL & "   AND DataFineCollaudo <= #" & rsMatr!DataInizioCollaudo & "#"
        
        Set rsMaPre = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges)
        If rsMaPre.EOF = False Then dtDataInizioIntervallo = rsMaPre!DataFineCollaudo
        rsMaPre.Close
        Set rsMaPre = Nothing

Succede che se il valore di rsMatr!DataInizioCollaudo è per esempio 11/01/2023 16:03:10 , la query mi estrae anche date superiori.

Cosa mi sfugge? Dove sbaglio?

Grazie

5 Risposte

  • Re: [Risolto] Filtro per data inferiore o uguale

    Stai scrivendo un predicato SQL con una formattazione ERRATA proprio nel criterio della Data, questo è il motivo per il quale non ti funziona…!

    Come dovresti aver letto nella ricerca della sintassi da usare per le date, dal momento che usi il carattere [#] il motore JET SQL necessita di una data nel formato americano/anglosassone (mm/dd/yy) o nel formato ISO (yyyy-mm-dd)

    Quindi nel formato base serve inversione [mm/dd], il nostro sistema operativo Italiano invece come DefaultSetting ha [gg/mm], conseguenza quello che per te è il 2 Aprile, per lui è il 4 Febbraio… se verifichi tutto andrà bene per date superiodi al 12 del mese.

    Se la data deve contenere hh:mm:ss io ti suggerirei questa modifica.

    strSQL = strSQL & "   AND DataFineCollaudo <= " & Str(CDbl(rsMatr!DataInizioCollaudo)) 

    Vedrai che così funziona…

  • Re: [Risolto] Filtro per data inferiore o uguale

    Grazie @Alex 

    Avevo provato con la formattazione ISO, ma i problemi eranoi medesimi.

    Nell'ansia di trovare la soluzione, ho ignorato l'esistenza della funzione Cdbl,

    Grazie

  • Re: [Risolto] Filtro per data inferiore o uguale

    15/02/2024 - Snupix ha scritto:


    Grazie @Alex 

    Avevo provato con la formattazione ISO, ma i problemi eranoi medesimi.

    Nell'ansia di trovare la soluzione, ho ignorato l'esistenza della funzione Cdbl,

    Grazie

    Attenzione che solo la conversione in Double non basta, se non metti la funzione STR in questo caso fondamentale non funziona, questo perchè dal momento in cui hai appunto hh:mm:ss, hai i decimali, e la funzione STR converte il separatore Decimale in quello giusto a prescindere dai Regional Settings JET vuole una cosa mentre il VBA ne ha un'altra [VIRGOLA/PUNTO]

    Verifica sempre bene le informazioni che ti danno.

  • Re: [Risolto] Filtro per data inferiore o uguale

    Nonostante la conversione in double non funziona alla seconda lettura.

    Di seguito una serie ristretta di dati che leggo dalla query QryMatricoleCollaudate 

    ID_OperatoreID_MatricolaNumeroMatricolaDataInizioCollaudoDataFineCollaudoTempoCollaudoTempoAttesaCollaudo
    35249651143611/01/2023 16:03:1011/01/2023 16:18:1000:15:0000:06:00
    35249641143511/01/2023 15:42:5711/01/2023 15:57:5700:15:0000:00:00
    35249631143411/01/2023 15:24:1711/01/2023 15:39:1700:15:0000:00:00
    35249621143311/01/2023 14:54:1811/01/2023 15:09:1800:15:0000:00:00
    35249611143211/01/2023 14:31:2811/01/2023 14:46:2800:15:0000:00:00
    35249601143111/01/2023 14:08:5811/01/2023 14:23:5800:15:0000:00:00
    QryMatricoleCollaudate

    Devo calcolare il tempo di attesa che intercorre fra la DataInizioCollaudo della matricola corrente e la DataFineCollaudo della matricola precedente, inteso come date inferiori.

    Inizio dal ID_Matricola 24965 e calcolo con l'ID_matricola 24944 immediatamente precedente (secondo l'estrazione della query in questione) e in queso caso il codice calcola correttamente 6 minuti.

    Il codice poi passa all'ID_Matricola 24964 e la query che mi crea problemi, invece di considerate l'ID_Matricola 24963 considera l'ID_matricola 24965, cioè la precedente. 

    Non riesco a spiegarmelo.

  • Re: [Risolto] Filtro per data inferiore o uguale

    Ho risolto creando nella query QryMatricoleCollaudate due campi convertiti double corrispondenti alle due date coinvolte e usare i due campi convertiti nella WHERE.  

     

Devi accedere o registrarti per scrivere nel forum
5 risposte