• User Attivo

    [SQL] Ordinare i record in base al confronto di due date

    ciao a tutti!
    ho il problema di ordinare i dati provenienti da una query SQL in una tabella (...che fin qui sembra banale!), tuttavia (almeno a quanto so io!) non posso ordinarli direttamente dalla SELECT SQL perchè l'ordinamento si basa su un campo calcolato a partire dalla base dati.
    Mi spiego meglio, nella base dati ho il campo data inizio e data approvazione, quando effettuo la query in automatico la pagina asp calcola la data scadenza a partire dalla data inizio o dalla data approvazione + xx giorni. La tabella che ne risulta deve essere ordinata per data di scadenza!
    I dati della query sql li appoggio subito in un array per poter fare la paginazione dei risultati stessi. Ora non so come posso ordinare questa tabella!
    Aspetto soccorso!!!!!
    Grazie,

    Marco


  • User Attivo

    o aggiungi un campo "data_scadenza" o riversi i risultati in una tabella temporanea e li riordini........

    sempre se ho capito bene il problema ....

    😉


  • User Attivo

    hai capito perfettamente e ti ringrazio del consiglio...volevo proprio evitare sia il campo data_scadenza (in quanto è un campo calcolato al volo) sia di dover riversare su un'altra tabella...
    ma in questa seconda ipotesi tu come faresti?
    grazie!

    Marco


  • Moderatore
    
    select (data_inizio + 20) AS Scadenza from tabella
    order by (data_inizio + 20) DESC;
    
    

    Dovrebbe funzionare...:figo:

    :ciauz:


  • User Attivo

    ciao Paolo!
    grazie per il suggerimento...il problema è che, oltre al problema del +xx giorni, l'ordinamento va fatto su due colonne congiuntamente in questo modo:
    ID COLONNA1 COLONNA2
    1 01/01/2007
    2 05/04/2007
    3 02/03/2007 01/11/2007
    4 31/12/2006

    il corretto ordine è: 3,4,1,2!
    so che è un gran caos...
    grazie!!

    Marco


  • Moderatore

    Bel casino!

    Comunque la soluzione esiste ed è questa (l'ho testata):

    
    SELECT tbldate.id_campo, 
               **IIf(not IsNull([data2] and data1>data2),[data2]+20,[data1]+20) **AS Scadenza
    FROM tbldate
    ORDER BY **IIf(not IsNull([data2] and data1>data2),[data2]+20,[data1]+20)**;
    
    

    Tutto questo nell'ipotesi che:

    1. Data1 (cioè colonna1) sia sempre NOT NULL e Data2 può assumere valori NULL
    2. Se Data2 esiste allora deve essere data1>data2
    3. Il time-out della scadenza sia di 20 giorni.

    Come ho già detto in post precedenti all'interno dell'SQL di Access si possono fare cose molto potenti, basta studiare tutte le funzioni elencate nel generatore di espressioni attivabile cliccando sulla "bacchetta magica" che appare nella barra degli strumenti di "Visualizzazione struttura della Query".

    Suggerimento: Per velocizzare l'esecuzione della query verifica che su Data1 e Data2 sino entrambi campi che accettano valori Null e che siano indicizzati (Valori duplicati: si!)

    PS: C'è un errore nella tabella che hai presentato, probabilmente il valore di colonna2 del terzo record è 01/11/200**6 **altrimenti non ha senso l'ordine: 3,4,1,2 😉

    :ciauz:


  • User Attivo

    ...in effetti era 2006!!!
    grazie Paolo, ti adoro! :perfavore:

    funziona a meraviglia...ora per le prossime provo anch'io con la bacchettina magica di Access!!

    Marco


  • Moderatore

    @sherlock said:

    ...in effetti era 2006!!!
    grazie Paolo, ti adoro! :perfavore:
    esagerato!...

    funziona a meraviglia...ora per le prossime provo anch'io con la bacchettina magica di Access!!

    ...ecco bravo! 😉

    :ciauz: