Newsgroup: it.comp.lang.visual-basic
Titolo: Gestione date in SQL, (e basta!!)

Salve a tutti.
Ci risono!
Ho un problemino all'apparenza banale del quale pero' non riesco a venire 
a capo.
In una tabella fatta cosi' ho alcuni record:
DataInizio	DataFine	....
01/04/03	10/04/03
01/04/03	10/04/03
01/04/03	10/04/03
11/04/03	20/04/03
11/04/03	20/04/03
11/04/03	20/04/03
21/04/03	30/04/03
21/04/03	30/04/03
21/04/03	30/04/03
Devo creare una query, la quale mi permetta di selezionare i record di un 
periodo Dal.. Al.. tenendo conto dei periodi inclusi tra il campo di 
DataInizio e DataFine, mi spiego:
se passo alla query...
dal=05/04/03	al=09/04/03
questa deve ritornare i record del periodo 01/04/03-10/04/03
dal=05/04/03	al=12/04/03
deve ritornare i record del periodo 01/04/03-10/04/03 e 11/04/03-20/04/03
Qui mi casca l'asino, con le sintassi che ho provato non riesco a 
valutare i valori intermedi dei campi ed anche il between non mi ha 
aiutato.
Capisco di essermi incartato e vi tedio per una banalita' pero' con sto' 
caldo si arriva prima alla frutta!, e son gia' le 10 (di sera).
ps. i campi sono 'Data' di Access.
Grazie.
Paolo.

 deve ritornare i record del periodo 01/04/03-10/04/03 e 11/04/03-20/04/03
In tutta sincerità, credo che non si possa.
Credo che tu debba "elaborare" le date impostate prima di passarle a SQL in
modo da fornire i limiti esatti. In ogni caso non vedo come si possa
risolvere il problema di due o più periodi "interni" passando due sole date.
Se tu potessi mettere nel database un altro campo, per esempio, il numero
della settimana (o decade) dell'anno potresti richiedere un Group By per
quel campo. Non credo, pur ammettendo che VB+Access (ma DAO o ADO?)
forniscano funzioni (molte di VB) sulle quali fare calcoli e, magari,
trattare i campi Data come numeri (tali sono) si possa ottenere quello che
vuoi...

 
Potrei forse trattare le date come double?
Sarebbe un vero peccato perche' ho una querona immensa che mi farebbe 
tutto il lavoro e per questa str@#& (mia) mi tocchera' riprogettare il 
tutto!.
Grazie
Paolo.

 Lupo, ma sempre brutte notizie mi devi dare!
Vedi se questo ti può servire da spunto:
Select
(month(data)*10)+Fix(day(data)/10) As Mese_e_Decade,
Sum(campo_totale_1) As Tot1,
Sum(campo_totale_1) As Tot2,
From tabella
Group By
(month(data)*10)+Fix(day(data)/10)

 
Grazie. (anche per quella precedente.)
Ciao
Paolo.

 ... (anche per quella precedente.)
Non ci son su... :-(

 
Non so con Access quanto possa essere pesante un prodotto cartesiano di 
una tavola per se stessa; con Oracle ho risolto cosě un problema simile:
SELECT UNIQUE T1.* FROM Tavola T1, Tavola T2 
WHERE 
   (    DATE '2003-04-05' BETWEEN T1.DataInizio AND T1.DataFine
    AND DATE '2003-04-12' BETWEEN T2.DataInizio AND T2.DataFine)
OR
   (    DATE '2003-04-05' BETWEEN T2.DataInizio AND T2.DataFine
    AND DATE '2003-04-12' BETWEEN T1.DataInizio AND T1.DataFine)
La 'traduzione' di UNIQUE dovrebbe essere DISTINCTROW e quella di 
DATE 'YYYY-MM-DD' credo sia #YYYY-MM-DD#
-- 
Ciao, Mauro CB

 
Grazie verifico subito...
Paolo

 In tutta sincerità, credo che non si possa.
No, dai, è solo un gioco di Not, And e Or.
Sostanzialmente, basta ragionare pensando a ciò che non deve avvenire: NON
deve avvenire che entrambe le date (inizio e fine) siano minori della
data_limite_inferiore o entrambe maggiori della data_limite_superiore.
Se ho capito bene il problema.
Ciao
Alberto

[*Albe V°* : 
vaccariTO...@hotmail.com
] ha scritto:

Beh, il dubbio è lecito, ma io ho capito così, dal primo post:
Passo alla queli _solo_ due date (non quindi una serie di coppie di date),
la più bassa e la più alta, in assoluto
Il comando deve restituirmi tutte le possibili situazioni, _raggruppate per
decade_ (mi par di capire dall'esempio) in quell'unico (ma che potrebbe
essere molto ampio) intervallo specificato. Ecco il perchè del mio esempio.

[*PaoloFi* : 
Pao...@lycos.it
] ha scritto:

Ma, scusate, quella (a aparte l'UNIQUE che non conosco) mi pare una
normalissima query alla quale si passano tutti gli intervalli di periodo. A
me pareva d'aver capito che tu vuoi passare solo una coppia di date limite e
il sistema deve restitueire, separate, tutte le decadi in quel periodo...

 deve ritornare i record del periodo 01/04/03-10/04/03 e >11/04/03-20/04/03
 In base all'esempio che hai fatto e senza fare un prova perchè non mi va
  SELECT * FROM TuaTabella
  WHERE ( ( [datainizio] BETWEEN DataInizio And DataFine ) OR
          ( [datafine] BETWEEN DataInizio And DataFine ) )
Ciao
 
--------------------------------
Inviato via 
http://usenet.libero.it

           ( [datafine] BETWEEN DataInizio And DataFine ) )
Boh, io devo aver perso la capacità di leggere...

 _raggruppate per decade_ (mi par di capire dall'esempio)
Ecco, il 'raggruppate' a me non era chiaro.
Pensavo a estrarre 'tutti' i record per i quali l'intervallo fra data_inizio
e data_fine cadeva, anche parzialmente, nell'intervallo limite specificato.
Quindi, ribaltando il concetto, bastava che NOT il record iniziasse e
finisse tutto prima o tutto dopo il periodo indicato.
Comunque, come sempre in questi casi, basta che il quesito sia posto bene e
la soluzione si trova in un minuto. Purtroppo, spesso la gente fa dei gran
esempi anzichč dire in tre parole quello che vuole. Del resto, questa č la
differenza fra l'analista e lo sviluppatore.
Ciao
Alberto


 Cos'è che non ti torna???
Cia


  Cos'è che non ti torna???
Non mi pare che sia stato chiesto questo.
Ho riletto il primo post, ho risposto anche ad Albe.
Ora, considerando ovviamente il fatto che _io_ possa aver capito roma per
toma, rinuncio e aspetto chiarimenti dall'autore su quello che esattamente
vuole ottenere.