Calcolo dell'età e elenco in ordine di anzianità

di il
5 risposte

Calcolo dell'età e elenco in ordine di anzianità

Ciao a tutti

Sto cercando di creare un report che mi elenchi (almeno per ora) i dipendenti in ordine di età, dal più vecchio al più giovane (o anche viceversa).

Impostando la query in questo modo:

SELECT [Cognome] & ' ' & [Nome] AS NomeComp, DateDiff('yyyy',[NatoIl],Date()) AS Eta FROM tblPersonale ORDER BY DateDiff('yyyy',[NatoIl],Date()) DESC;

Il risultato è corretto, o almeno lo è parzialmente.

Infatti se ad esempio ho 3 nominativi ambetre (scherzo)....  di 45 anni, mi vengono ordinati solo per ordine alfabetico A-B-C

Ma se per caso B fosse più vecchio (per il mese di nascita) di C che è più vecchio di A, l'ordine dovrebbe essere B-C-A

Girovagando in rete ho trovato come calcolare l'effettivo cambio di età (dato che DateDiff si limita a calcolare la differenza in anni, ma aggiungendo una verifica Iff è possibile essere precisi), che può avere la sua utilità se magari devo calcolare una scadenza o verificare che un dato soggetto ad una data specifica abbia realmente compiuto gli anni richiesti.

Ma nel mio caso non credo vada bene, perchè mi interessa sapere che, ad esempio, quest'anno ci sono X persone che compiono 45 anni (e qui la mia query fa il suo dovere) ma al tempo stesso mi vengano riportate nell'ordine in cui compiranno gli anni (e quindi in base al mese e a parità di mese in base al giorno).

Suggerimenti?

Grazie

Andrea

5 Risposte

  • Re: Calcolo dell'età e elenco in ordine di anzianità

    Ciao,

    dal più vecchio al più giovane

    SELECT [Cognome] & ' ' & [Nome] AS NomeComp, DateDiff('yyyy', [NatoIl], Date()) AS Eta, [NatoIl]
    FROM tblPersonale
    ORDER BY DateDiff('yyyy', [NatoIl], Date()) DESC, Format([NatoIl], "mmdd");

    dal più giovane al più vecchio

    SELECT [Cognome] & ' ' & [Nome] AS NomeComp, DateDiff('yyyy', [NatoIl], Date()) AS Eta, [NatoIl]
    FROM tblPersonale
    ORDER BY DateDiff('yyyy', [NatoIl], Date()), Format([NatoIl], "mmdd") DESC;
  • Re: Calcolo dell'età e elenco in ordine di anzianità

    Scusate ma non capisco perché spezzare anno mese ed altre cose... se si ordina per criterio Alfabetico e per DataNascita non va bene...?

    Se poi si vuole dal più vecchio al più giovane basta usare Desc...?

    Quel modo poi di calcolare l'età espone ad imprecisioni.

    Nel caso serva l'età su può vedere questo:

    www.donkarl.com/it?FAQ2.7

    Forse ho frainteso...

  • Re: Calcolo dell'età e elenco in ordine di anzianità

    derivato da Dev Ashish:

    DateDiff("aaaa";[DataNascita];Date())+(Format(Date();"mmgg")<Format([DataNascita];"mmgg"))

    Prima tramite DateDiff vengono calcolati gli anni tra le due date.
    Poi verifica se giorno e mese della data attuale sono inferiori alla data di nascita.
    In caso positivo un anno dev'essere detratto.

    Ciao @Alex direi proprio di si !  ... Non mi sono posto il problema, io per esempio ho sempre usato una funzione esterna con il ritorno degli Anni e Giorno Mese del compleanno,insomma... altri scenari... non mi è mai capitato di doverla calcolare in linea in questo modo

    e in tal caso:

    dal più vecchio al più giovane

    SELECT [Cognome] & ' ' & [Nome] AS nomeCampo, DateDiff("yyyy",[NatoIl],Date())+(Format(Date(),"mmdd")<Format([NatoIl],"mmdd")) AS Eta, [NatoIl]
    FROM tblPersonale
    ORDER BY [NatoIl] ASC;

    dal più giovane al più vecchio

    SELECT [Cognome] & ' ' & [Nome] AS nomeCampo, DateDiff("yyyy",[NatoIl],Date())+(Format(Date(),"mmdd")<Format([NatoIl],"mmdd")) AS Eta, [NatoIl]
    FROM tblPersonale
    ORDER BY [NatoIl] DESC;
  • Re: Calcolo dell'età e elenco in ordine di anzianità

    Non so de ho capito bene...

    pippo nato il 10/1/2000 25 anni

    pluto nato il 20/1/2000 25 anni

    topolino nato il 15/01/2000 25 anni

    hanno la stessa età quindi vengono ordinati per nome

    datediff per anno (yyyy) ti da sempre l'eta il che può andare bene ma quando ordini devi mettere l'eta, annonascita, nome

    così prima ordini per età 45 anni nel tuo caso

    poi per anno di nascita

    infine per nome.

    ottieni l'ordine: pippo 25 anni; topolino 25 anni; pluto 25 anni

  • Re: Calcolo dell'età e elenco in ordine di anzianità

    12/04/2025 - sihsandrea ha scritto:

    Non so de ho capito bene...

    Da quello che ho capito l'OP vorrebbe (condizionale d'obbligo) avere un risultato di questo tipo:

    (data di rifermenti oggi 12/04/2025)
    In blue evidenziato The Pooh Winnie che ancora non ha fatto il compleanno e risulta più piccolo...  quindi ha un anno in meno fino a domani.

    In rosso si evedenziano nominativi che per lo stesso anno e mese ma con giorno diverso, possono essere più vecchi oppure più giovani.

    Dal più vecchio al più giovane   Dal più giovane al più vecchio  
    NomeCompEtaDataNascita NomeCompEtaDataNascita
    Locatelli Manuel2601/02/1999 Marcos Antonio2501/01/2000
    Rossi Valentino2601/02/1999 Mandragora Rolando2501/12/1999
    Tsadjout Frank2601/02/1999 Maleh Youssef2501/11/1999
    Lombardi Cristiano2601/03/1999 Zirkzee Joshua2501/11/1999
    Valencia Diego2601/03/1999 Maldini Daniel2501/10/1999
    Lovric Sandi2601/04/1999 Zapata Duvan2501/10/1999
    Verde Daniele2601/04/1999 Malagrida Lorenzo2501/09/1999
    Capirossi Loris2603/04/1999 Vorlicky Lukas2501/09/1999
    Orso Yoghi2611/04/1999 Maggiore Giulio2501/08/1999
    Orso Bubu2612/04/1999 Voelkerling Persson2501/08/1999
    The Pooh Winnie2513/04/1999 Lunetta Gabriel2501/06/1999
    Luis Alberto2501/05/1999 Vlahovic Dusan2501/06/1999
    Vergani Edoardo2501/05/1999 Luis Alberto2501/05/1999
    Lunetta Gabriel2501/06/1999 Vergani Edoardo2501/05/1999
    Vlahovic Dusan2501/06/1999 The Pooh Winnie2513/04/1999
    Maggiore Giulio2501/08/1999 Orso Bubu2612/04/1999
    Voelkerling Persson2501/08/1999 Orso Yoghi2611/04/1999
    Malagrida Lorenzo2501/09/1999 Capirossi Loris2603/04/1999
    Vorlicky Lukas2501/09/1999 Lovric Sandi2601/04/1999
    Maldini Daniel2501/10/1999 Verde Daniele2601/04/1999
    Zapata Duvan2501/10/1999 Lombardi Cristiano2601/03/1999
    Maleh Youssef2501/11/1999 Valencia Diego2601/03/1999
    Zirkzee Joshua2501/11/1999 Locatelli Manuel2601/02/1999
    Mandragora Rolando2501/12/1999 Rossi Valentino2601/02/1999
    Marcos Antonio2501/01/2000 Tsadjout Frank2601/02/1999
    SELECT [Cognome] & ' ' & [Nome] AS nomeCampo, DateDiff("yyyy",[NatoIl],Date())+(Format(Date(),"mmdd")<Format([NatoIl],"mmdd")) AS Eta, [NatoIl] 
    FROM tblPersonale ORDER BY [NatoIl] ASC;

    SELECT [Cognome] & ' ' & [Nome] AS nomeCampo, DateDiff("yyyy",[NatoIl],Date())+(Format(Date(),"mmdd")<Format([NatoIl],"mmdd")) AS Eta, [NatoIl]
    FROM tblPersonale ORDER BY [NatoIl] DESC;
Devi accedere o registrarti per scrivere nel forum
5 risposte