+ Rispondi al messaggio
Pagina 2 di 4 primaprima 1234 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 35

Estrazione Dati in Range [gg/mm] senza [Anno]

  1. #11
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Quote Originariamente inviato da willy55 Visualizza il messaggio
    Se ho compreso l'esigenza: ovvero si vogliono determinare le date che ricadono in un intervallo continuo (DAL- AL) dei giorni (e mesi) indipendentemente dall'anno.
    Quindi nel caso in cui il valore DAL (come associazione di mese e giorno) sia più piccolo del valore (AL) l'intervallo ricade nell'anno in corso (e quindi applicabile la semplice BETWEEN dell'esempio); altrimenti (DAL maggiore di AL) siamo nel caso di intervalllo che ricade nell'anno successivo e quindi il criterio della BETWEEN può essere semplicemente DAL (come giorno, mese e anno della data) mentre per AL sarà giorno, mese e anno incrementato dell'unità.
    Non è proprio così, se ho ben compreso,... lo spiegavo nell'esposto sopra, riprendo l'esempio:

    CampoData=05/01/2000
    INIZIO RANGE=15/12 [15 Dicembre]
    FINE RANGE=15/1 [15 Gennaio]

    Risulta evidente che la data dovrebbe essere inclusa..., ma...

    Al [Fine Range] prendo l'anno e lo incremento di 1:
    CampoData=05/01/2000
    INIZIO RANGE=15/12/2000 [15 Dicembre]
    FINE RANGE=15/1/2001 [15 Gennaio]

    Intendevi questo...?
    La data in analisi NON rientra più nel Range.

    Ho capito male quanto proponi...?
    ℹ️ Leggi di più su @Alex ...

  2. #12
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    L'intento è cercare chi compie gli anni dal [gg1/mm1]÷[gg2/mm2], quindi l'anno non deve avere alcuna rilevanza fattiva in qualsiasi anno compierebbero gli anni... bisestili inclusi

    Concordo con la funzionalità di cui parli... ma entra in gioco non solo l'aspetto delle 2 Query, anche l'aspetto del Costrutto SQL che risulta più complesso da articolare...
    Alla fine il vero problema è la durata dell'anno che è variabile e che rende non corretto qualsiasi approccio che tenti di sfruttare il campo data come campo numerico al quale applicare delle formule ...
    Anche la formattazione del campo data in campo testo MMDDYYYY non aiuterebbe nel caso di range che scavalca l'anno.
    Confesso che al momento non vedo soluzione migliore di quanto già proposto da Alex.

  3. #13
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Quote Originariamente inviato da Max.Riservo Visualizza il messaggio
    Alla fine il vero problema è la durata dell'anno che è variabile e che rende non corretto qualsiasi approccio che tenti di sfruttare il campo data come campo numerico al quale applicare delle formule ...
    Anche la formattazione del campo data in campo testo MMDDYYYY non aiuterebbe nel caso di range che scavalca l'anno.
    Si infatti avendo un cardine mobile non sequenziale in modo diretto... il tema non è così banale.
    Quote Originariamente inviato da Max.Riservo Visualizza il messaggio
    Confesso che al momento non vedo soluzione migliore di quanto già proposto da Alex.
    Io ci ho sbatutto la testa qualche ora... per arrivare a questa idea, speravo tuttavia di aver qualche alternativa sfuggita più "banale" nel senso di Funzionalmente semplice.
    ℹ️ Leggi di più su @Alex ...

  4. #14
    L'avatar di willy55
    willy55 non è in linea Scribacchino
    Se può essere utile, buttata di getto, una soluzione con le semplici query è di estrarre dalla data il mese e giorno come stringa e confrontarla in base all'intervallo in esame, fornendo il valore di partenza quale elemento più piccolo fra i due.
    Ad esempio per estrarre i dati dalla tabella la cui data dell'operazione ricada fra il 15 di febbario ("0215") ed il 14 di marzo ("0314") come valori maggiori e minori di questi, e quindi esclusi dall'intervallo; un esempio è il seguente:

     
    SELECT Tabella.*, Format([DataOperazione],"mmdd") AS MMAA
    FROM Tabella
    WHERE (((Format([DataOperazione],"mmdd"))>"0215" And (Format([DataOperazione],"mmdd"))<"0314"));
    

    Nel caso si voglia un intervallo fra il 25 dicembre ("1225") ed il 17 gennaio ("0117") si nega il costrutto in quanto si deve operare nell'anno successivo; quindi un esempio è quello sotto riportato:

     
    SELECT Tabella.*
    FROM Tabella
    WHERE ((((Format([DataOperazione],"mmdd"))>"0117" And (Format([DataOperazione],"mmdd"))<"1225")=False));
    
    ℹ️ Leggi di più su willy55 ...

  5. #15
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Ciao Willy, ho capito sembra però che la condizione della variante vada gestita richiedendo pertanto codice o in ogni caso una differenziazione del costrutto... potrebbe risultare meno versatile e meno scalabile mi pare.
    ℹ️ Leggi di più su @Alex ...

  6. #16
    L'avatar di willy55
    willy55 non è in linea Scribacchino
    Il costrutto può essere stabilito con parametri (o funzione specifica) che nella condizione stabilisca in base al valore logico (vero o falso) l'intervallo che si vuole.
    Partendo dall'esame del periodo (DAL - AL) espresso nei due valori di mese e giorno (sotto forma di 2+2 caratteri per un totale di 4); sommariamente:
    ( Format([DataOperazione],"mmdd")) > DAL And (Format([DataOperazione],"mmdd")) < AL )
    
    questo restituirà vero o falso in base all'intervallo che si vuole prendere in considerazione.
    Quindi in una forma più generica la possiamo esprimere confrontandola con un valore logico VEROFALSO, al fine di ricercare il periodo di interesse, schematicamente:
    ((( Format([DataOperazione],"mmdd")) > DAL And (Format([DataOperazione],"mmdd")) < AL ) = VEROFALSO ))
    
    da impostare nella condizione WHERE che deve soddisfare la query.
    Per cui se vogliamo l'intervallo fra le date, all'interno dell'anno forniremo TRUE, altrimenti se vogliamo quelle che vanno a cavallo dei due anni forniremo FALSE.
    Nel primo caso stiamo andando dal valore più basso a quello più alto e ci troviamo, quindi, all'interno dell'anno (esempio con DAL="0103" e AL="1230").
    Nell'altro caso (esempio con DAL="1230" e AL="0103", ovvero DAL è superiore ad AL) ci troviamo nell'anno successivo e quindi al di fuori dell'intervallo precedente (diverso da quello ascendente, ne consegue che quindi restituirà falso) ed è come se si andasse sotto forma discendente (a ritroso dal valore AL al valore DAL, e quindi DAL="0103" e AL="1230").
    Ciò è motivabile in quanto l'insieme dei valori, di ciascuna data, presa come stringa MMGG è come se fosse una sequenza che va da 0101 a 1231 e viceversa.
    Se volessimo banalizzare, potremmo anche rappresentabili come una torta ove nella circonferenza abbiamo l'insieme dei valori (presi come stringhe) dell'intera sequenza di calendario:
    0101, 0102, 0103, 0104, ... 0131, 0201, 0202, 0203, ... 0301, ... 0701, 0702, ... 1230, 1231
    ove l'ultimo valore è contiguo al primo (per chiudere l'anello).
    Quindi se ne prendiamo una porzione (schematicamente una fetta) è come se agissimo su un intervallo di valori (quindi compresi nel periodo DAL-AL) e quindi nella condizione TRUE, altrimenti se vogliamo quelli al di fuori all'intervallo stesso, stiamo prendeno la porzione rimanente (quindi è come se si andasse nel senso inverso) fornendo FALSE e quindi stiamo agendo sull'accavallamento fra i due anni.
    Ultima modifica di willy55; 22-08-2021 13:49 
    ℹ️ Leggi di più su willy55 ...

  7. #17
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Spero di aver capito, ma dai risultati nutro dubbi,... riassumo brevissimo.
    Siccome [15/12]>[15/01] è sempre vero a prescinedere dall'anno, tant'è che da Finestra immediata:
    ? "15/12/2000" > "15/01/2001"
    Vero
    
    mentre
    ?#15/12/2000# > #01/01/2001#
    Falso
    
    Viene avvalorato il confronto tra STRINGHE e non Numerico/Data... tu dici che per date nello stesso anno il confronto funziona sempre, e concordo essendo i numeri dei mesi progressivi, mentre per il salto anno basta il complementare temporale, ovvero si esclude il periodo.

    Dati di Test:
    ID	Nome	Cognome	Nascita
    1	Paolo	Rossi	01/02/1944
    2	Pietro	Caruso	25/08/1966
    3	Andrea	Calza	13/01/1958
    4	Antonio	Lima	12/08/1975
    5	Carlo	Salvi	16/12/2001
    6	Aldo	Bianchi	16/01/2000
    
    Genero il codice preposto:
        sSQL = "SELECT * FROM T1  WHERE "
        sSQL = sSQL & "((((Format([Nascita], 'mmdd')) > '" & Format(MonthIni, "00") & Format(DayIni, "00") & "' And (Format([Nascita], 'mmdd')) < '" & Format(MonthEnd, "00") & Format(DayEnd, "00") & "') = " & CBool(MonthIni < MonthEnd) & "))"
        CurrentDb.QueryDefs("Q_Test").SQL = sSQL
    
    Sicchè se faccio questo esempio già esplicitato nel predicato con "0815"÷"1018":
    SELECT * FROM T1
    WHERE ((Format([Nascita], 'mmdd') > '0815') And (Format([Nascita], 'mmdd') < '1018')) = True;
    
    Ottengo un risultato corente.
    2	Pietro	Caruso	25/08/1966
    
    Se invece prendo "1215"÷"0118" ed il predicato SQL diviene:
    SELECT * FROM T1
    WHERE ((Format([Nascita], 'mmdd') > '1215') And (Format([Nascita], 'mmdd') < '0118')) = False;
    
    Ottengo tutti i Records... cosa non attesa.

    Quindi probabilmente o mi sfugge qualche cosa oppure ho sbagliato qualche cosa.
    Ultima modifica di @Alex; 23-08-2021 09:46 
    ℹ️ Leggi di più su @Alex ...

  8. #18
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Se invece prendo "1215"÷"0118" ed il predicato SQL diviene:
    SELECT * FROM T1
    WHERE ((Format([Nascita], 'mmdd') > '0118') And (Format([Nascita], 'mmdd') < '1215')) = False;
    
    Willy aveva proposto, per questa casistica, l'inversione tra l'inizio e la fine del periodo di ricerca ... forse questo è il trucco per far funzionare il tutto.

  9. #19
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Inizialmente avevo capito anch'io questo... ed infatti ho replicato con il dubbio di dover intervenire da vba... che trovavo meno pratico e non scalabile... poi la replica mi ha fatto capire forse male...?
    ℹ️ Leggi di più su @Alex ...

  10. #20
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Inizialmente avevo capito anch'io questo... ed infatti ho replicato con il dubbio di dover intervenire da vba... che trovavo meno pratico e non scalabile... poi la replica mi ha fatto capire forse male...?
    Tralasciando il fatto che occorre avere 2 query distinte, hai avuto modo di verificare se quanto proposto da Willy funziona (non è che voglio sfruttare il tuo tempo ma siccome hai già predisposto dei casi prova e devi solo invertire min/max nei criteri di ricerca)?

+ Rispondi al messaggio
Pagina 2 di 4 primaprima 1234 ultimoultimo

Potrebbero interessarti anche ...

  1. Generare numeri casuali senza duplicati (estrazione lotto)
    Da padronus5 nel forum Microsoft Excel
    Risposte: 4
    Ultimo Post: 06-06-2014, 10:36
  2. Estrazione URL da range di celle evitando ciclo
    Da genespos nel forum Microsoft Excel
    Risposte: 0
    Ultimo Post: 22-08-2013, 13:18
  3. Risposte: 5
    Ultimo Post: 07-08-2010, 09:41
  4. Filtrare per Mese e Anno senza inserire i Giorni
    Da Maury63 nel forum Visual Basic .Net
    Risposte: 9
    Ultimo Post: 01-07-2010, 15:59
  5. Inserimento solo l'anno (senza mese e giorno)
    Da Martin Landau nel forum Microsoft Word
    Risposte: 5
    Ultimo Post: 30-10-2006, 12:24