Filtro data compresa tradue intervalli | SQL & MySQL

Topic: Pubblico - Composto da 4 Posts di 2 Utenti.

13 Agosto, 2011 09:48 #1
pigeonit
Utente

pigeonit
Registrato: Feb, 2011
Posts: 14
Offline

Buongiorno da giorni sto provando a far funzionare una query che mi filtri delle date su una tabella che non siano comprese entro certi range salvati su un'altra tabella. Mi spiego meglio:
In una tabella che si chiama "giorni_feriali" ho un campo denominato "Giornata" esso è un elenco ordinato di date es. da oggi alla fine dell'anno. in un'altra tabella che si chiama "ferie_rfi" ho due campi uno denominato "FRFI_From_Date" e l'altro "FRFI_To_Date" determinanado cosi per ogni record un intervallo di date. Lo scopo è quello di conteggiare tutte le date in "giorni_feriali" che non siano comprese in nessuno degli intervalli della tabella "ferie_rfi". Ho provato così

1SELECT DISTINCT count(GF.Giornata) AS expr1
2FROM
3  giorni_feriali GF
4INNER JOIN ferie_rfi FRFI
5ON GF.Giornata NOT BETWEEN FRFI.FRFI_From_Date AND FRFI.FRFI_To_Date

Il risultato è che ogni record presente in "giorni_feriali", ma non compreso nell'intervallo definito in "ferie_rfi", viene conteggiato tante volte quanti sono i record in "ferie_rfi" anzichè essere contato una sola volta. Mentre i record presenti in "giorni_feriali" e compresi nell'intervallo definito da "ferie_rfi" vengono conteggiati tante volte quanti sono i record in "ferie_rfi" - 1 anziche non contarlo per niente.

Vi faccio un ulteriore esempio per capire meglio cosa vorrei: Supponiamo che nella tabella "giorni_feriali" abbia 5 date che vanno dal 12/09/2011 al 16/09/2011 e in "ferie_rfi" ho due record dove il primo determina un intervallo che va dal 12/09/2011 al 12/09/2011 mentre il secondo determina un intervallo che va dal 15/09/2011 al 15/09/2011. il risultato della query che voglio io dovrebbe essere 3 invece la mia da 8 perchè conta una volta il 12/09/2011 e il 15/09/2011 (che non dovrebbe contare) due volte il 13/09/2011, il 14/09/2011 e il 16/09/2011 per un totale di 8 record.

Diciamo quindi che il risultato non è proprio quello che volevo io :-( qulache suggerimento?

13 Agosto, 2011 11:52 #2
pigeonit
Utente

pigeonit
Registrato: Feb, 2011
Posts: 14
Offline

Ho fatto qualche tentativo e sono giunto a questa soluzione:

 1SELECT count(GF.Giornata) AS Giorni
 2FROM
 3  giorni_feriali GF
 4WHERE
 5  GF.Giornata NOT IN (SELECT Giorni.Giornata
 6                          FROM
 7                            giorni_feriali Giorni
 8                          INNER JOIN ferie_rfi Ferie
 9                          ON Giorni.Giornata BETWEEN Ferie.FRFI_From_Date AND Ferie.FRFI_To_Date)

La testo per un po poi vi faccio sapere se va.

13 Agosto, 2011 14:25 #3
fuser
Utente

fuser
Registrato: Aug, 2011
Posts: 86
Offline

Forse tu sei stato chiaro, ma non ho capito: vuoi contare i giorni feriali o quelli non feriali? Quelli feriali dovresti riuscire a contarli così:

1SELECT count(g.giorni)
2FROM ferie_rfi f LEFT JOIN giorni_feriali g
3WHERE g.giornata BETWEEN f.FRFI_From_Date AND f.FRFI_To_Date;

Io ti consiglierei di scrivere questo dato in un apposito campo della tabella ferie, perchè leggerlo da questa JOIN è un'operazione inutilmente costosa.

13 Agosto, 2011 16:43 #4
pigeonit
Utente

pigeonit
Registrato: Feb, 2011
Posts: 14
Offline

Grazie fuser per la risposta. La tabella "giorni_feriali" contiene un elenco di giorni feriali (un record per ogni giorno feriale da qui ad un tempo x) ed è questi che io voglio contare. Il mio problema è escludere da questo conto gli eventuali giorni di ferie. I periodi di ferie sono memorizzati nella tabella "ferie_rfi" e sono espressi come range di data. Mi spiego: quando io inserisco un periodo di ferie non inserisco un record per ogni giorno di ferie ma inserisco un record che dice quando iniziano e quando finiscono le ferie.

comunque ho fatto diverse prove con la seconda query che ho postato e sembra che ho raggiunto il mio scopo.

Grazie
e Buon Ferragosto

Condividi su:

Loggati o Registrati per replicare