+ Rispondi al messaggio
Pagina 3 di 4 primaprima 1234 ultimoultimo
Visualizzazione dei risultati da 21 a 30 su 35

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

  1. #21
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Max, come puoi leggere dal mio Post #17, ho fatto tutte le prove di verifica, ma le ho fatte per come io ho interpretato il post di Willy, in particolare, magari puoi rileggere anche tu per conferma questi passaggi:
    Quote Originariamente inviato da willy55 Visualizza il messaggio
    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 ))
    
    Francamente se parliamo di solo 1 Query senza modifiche nè VBA ne di Statement, la cosa ha un certo interesse, se, come già accenanto richiede 2 Query ed una certa gestione VBA direi che perde un po la valenza...
    Io però penso ancora di aver capito bene il messaggio di Willy, a cui tuttavia non trovo riscontro tecnico.
    ℹ️ Leggi di più su @Alex ...

  2. #22
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Max, come puoi leggere dal mio Post #17, ho fatto tutte le prove di verifica, ma le ho fatte per come io ho interpretato il post di Willy...
    Alex, io leggendo il post #14 e il #16 di Willy interpreto che lui suggerisce, per la casistica "1215"÷"0118" di invertire nella query il min e il max quindi scrivendo la seguente query :
    SELECT * FROM T1
    WHERE ((Format([Nascita], 'mmdd') > '0118') And (Format([Nascita], 'mmdd') < '1215')) = False;
    
    Poi magari ho capito male io il suggerimento di Willy e concordo che comunque occorre predisporre 2 query distinte...

  3. #23
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Scusa ma io anche rileggendo il #16, estrapolo meglio:

    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.
    Evidenzio in ROSSO quella parte che mi continua a far interpretare a mio modo... parrebbe che solo 1 Query fosse necessaria in cui True/False faccia la differenza...!

    Ora siccome a differenziare le 2 condizioni è solo il MeseIni>MeseEnd... resta semplice condizionarlo, se funzionasse..., e questo mi instilla il dubbio di aver capito male, ma se fosse corretta la tua interpretazione... verrebbe meno la semplicità di fruizione come appunto sostenevo alla prima mia replica #15
    Ultima modifica di @Alex; 23-08-2021 12:02 
    ℹ️ Leggi di più su @Alex ...

  4. #24
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    In attesa che Willy eventualmente chiarisca quoto cosa mi fa pensare che Willy intendesse, per il caso specifico e cioè l'inversione del DAL/AL :
    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));
    ....
    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...

  5. #25
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Si Max io concordo con te sull'interpretazione di quella parte, ma anche con quanto da me riportato che a mio avviso sembra avere un senso che restituisce una semplificazione alla DOPPIA query... Aspettiamo Willy.

    Infondo se ci pensi... [01/015]÷[12/15] se nello stesso anno sono proprio il COMPLEMENTARE al periodo... quindi se non soddisfatta, di certo ricadono nel periodo.
    ℹ️ Leggi di più su @Alex ...

  6. #26
    L'avatar di willy55
    willy55 non è in linea Scribacchino
    Sì, confermo il criterio della query è unico impostando i valori DAL - AL e valutando se questi restituiscono vero o falso.
    Nel caso dell'anno in corso i valori sono ascendenti e ricadono nell'intervallo (esclusi i valori estremi, in quanto si è posta la condizione di maggiore e minore e non uguale) e questa è la condizione vero (TRUE).
    Nel caso di periodo a cavallo fra gli anni, non si prende in considerazione l'intervallo sopracitato, ma l'insieme complementare, con l'accortezza di porre il valore (delle date trasformato in stringa di 4 caratteri) più basso in DAL e quello più alto in AL, quindi valutando quelli che corrispondono alla condizione falso (FALSE).
    ℹ️ Leggi di più su willy55 ...

  7. #27
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Quindi il fatto che dalle prove pubblicate non restituisca i dati richeisti...? (mio errore... o altro...?)
    Ultima modifica di @Alex; 23-08-2021 14:38 
    ℹ️ Leggi di più su @Alex ...

  8. #28
    L'avatar di willy55
    willy55 non è in linea Scribacchino
    Alex, non ho individuato a quale prove ti riferisci, ma ad esempio se vuoi i dati dal 15 dicembre ("1215") al 15 di gennaio ("0115") una query schematicamente è:

    SELECT * FROM T1
    WHERE ((Format([Data_Rife], 'mmdd') > '0115') And (Format([Data_Rife], 'mmdd') < '1215')) = False;
    
    ℹ️ Leggi di più su willy55 ...

  9. #29
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Ora ho capito meglio... il problema è che va gestito da VBA lo scambio o inversione del Range delle date...
    Supponiamo tu abbia delle TextBox in cui appunto consenti l'inserimento del Range...
    Quello che è RangeINI va invertito da codice con RangeEND... prima di passarlo, e la determinazione di False/True va fatta sempre esternamente in quanto una volta passati i parametri invertiti è tardi.

    Non so, nell'insieme temo, almeno a me pare così, non sia più semplice come soluzione.
    Ultima modifica di @Alex; 23-08-2021 15:18 
    ℹ️ Leggi di più su @Alex ...

  10. #30
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    Mi sono preso del tempo per fare delle prove sul metodo di Willy.
    Questa è la situazione di partenza (date formattate all'italiana) :
    Records tra il 01/01/2021 - 07/01/2021 -> 0
    Records tra il 15/12/2020 - 31/12/2020 -> 6 (nessun record il 15/12/2020)
    Quindi records totali nel periodo 15/12/2020 -07/01/2021 -> 6

    Records tra il 01/01/2020 - 07/01/2020 -> 1 (da notare : il record è del 07/01/2020)
    Records tra il 15/12/2019 - 31/12/2019 -> 14 (nessun record il 15/12/2019)
    Quindi records totali nel periodo 15/12/2019 -07/01/2020 -> 15

    Records tra il 01/01/2019 - 07/01/2019 -> 3 (da notare : tutti e tre del 07/01/2019)

    Richiesta : estrarre i records nel periodo tra il 15/12 e il 07/01 inclusi limitando la ricerca agli anni 2019,2020 e 2021
    Risultato atteso : 6+15 quindi 21 records.
    Nota importante : dal mio punto di vista i records dal 01/01/2019 al 01/07/2019 non dovrebbero essere estratti così come quelli dal 15/12/2021 al 31/12/2021 (questi non lo sono naturalmente perché al momento non esistono).

    Periodi richiesti 15/12-07/01 (dal 2019 al 2021)
    Query di prova :
    SELECT * FROM ODBC_VW_QTOU_LIST WHERE 
    (Format(QT_IssueDate,'MMDD') >= '0107' And Format(QT_IssueDate,'MMDD') <= '1215') = false
     And Year(QT_IssueDate) >= 2019 And Year(QT_IssueDate) <= 2021
    
    Risultato : 20 records estratti, manca il record del 07/1/2020
    Se richiedo dal 15/12 al 08/01 il risultato diventa : 24 records perché vengono estratti anche quelli presenti il 07/01/2019 (3) e quello presente il 07/01/2020 (1)
    Quindi, quanto proposto da Willy funziona ma, occorre estendere il periodo di ricerca di 1 giorno per estrarre anche i limiti (il 15/12 e il 07/01). L'estrazione riporta anche i records di gennaio 2019 che io personalmente non vorrei ma che concettualmente vanno estratti (si tratta di un mio punto di vista e niente mi vieta di limitare l'estrazione ai records tra il 15/12/2019 e il 07/01/2021 invece che limitarla tra gli anni 2019-2021).
    Ho provato anche a non effettuare l'inversione usando Start-End e ovviamente non funziona (ovvero riporta tutti i records che sono al di fuori del periodo).

    Non contento e siccome avevo abbozzato delle soluzioni con Not Between salvo poi pensare che non avrebbero funzionato ho fatto altri test, sempre con la stessa situazione di archivio e con la stessa richiesta.

    Questa query produce gli stessi risultati della precedente :
    SELECT * FROM ODBC_VW_QTOU_LIST WHERE 
    (Format(QT_IssueDate,'MMDD') Not Between '0107' And '1215')
     And Year(QT_IssueDate) >= 2019 And Year(QT_IssueDate) <= 2021
    
    Ovvero 20 records (15/12-07/01) oppure 24 (15/12-08/01)
    Da notare che ho utilizzato il Not Between mantenendo come range End-Start

    Adesso viene il bello : ho deciso di provare ad utilizzare Start-End (senza inversione quindi) :
    SELECT * FROM ODBC_VW_QTOU_LIST WHERE
    (Format(QT_IssueDate,'MMDD') Not Between '1215' And '0107')
     And Year(QT_IssueDate) >= 2019 And Year(QT_IssueDate) <= 2021
    
    e cosa incredibile ottengo GLI STESSI RISULTATI (20 records oppure 24 con 08/01).
    A quanto pare con il between NON serve fare lo 'swap' tra Start e End ... ora se qualcun'altro vuole confermare o smentire questa cosa sarebbe ben accetto.

    Ora mi resta da provare a fondo il metodo di Alex ...

+ Rispondi al messaggio
Pagina 3 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