Gestione delle date - Handling dates

| | Comments (2)

calendar.jpgIT

QlikView gestisce le date come il numero (decimale) di giorni passati dal 30 Dicembre 1899. Non ho mai capito perché, è una scelta abbastanza strana. Speravo che fosse un tributo a qualche evento interessante del 30 dicembre 1899, ma l'unico fatto apparentemente rilevante è la morte di un politico comunista svedese... Che delusione.
Tornando a noi, ciò significa che:

  • il giorno 2 è il primo Gennaio 1900 a mezzanotte
  • il giorno 2.5 è il primo Gennaio 1900 a mezzogiorno

Ne consegue un gran numero di proprietà comode per elaborare date, ma giocando con una data come se fosse un numero, la sua rappresentazione diventa numerica. Per tornare alla rappresentazione di data basta mettere attorno date() (o timestamp() se vogliamo mostrare anche l'ora; oppure impostare il formato nell'oggetto che mostra il campo con la data in questione).

Qualche esempio:

  • floor(now()) equivale a today(), cioè la mezzanotte di oggi (solo molto più pesante)
  • ceil(now()) è la mezzanotte di domani
  • now()+7 è fra una settimana a quest'ora
  • data_pagamento - data_scadenza_fattura è il numero di giorni di ritardo di pagamento
  • today() + 365*4 non è oggi fra 4 anni causa anni bisestili, per quello è più furbo usare addyears(today(), 4)
  • today() + 30 probabilmente non è lo stesso giorno del mese prossimo, per quello è più furbo usare addmonths(today(), 1)
  • 37145 + 0.36575 è circa uguale a makedate(2001, 9, 11) + maketime(8, 46, 40) che equivale a '11/09/2001 8.46.40'
  • 39739 è il mio prossimo compleanno

Una piccola nota sulla funzione date(espressione [, formato]): serve per formattare il primo argomento secondo la stringa di formato, se non viene specificata viene usato il valore della variabile DateFormat (impostato ad inizio script).
Attenzione però: modifica solo la rappresentazione, ma non tocca il dato. Infatti date(makedate(2008)+maketime(12), 'DD/MM/YYYY') ci mostrerà '01/01/2008' ma conterrà anche l'ora (mezzogiorno). Per capire come mai la rappresentazione sia diversa dal valore numerico sottostante, vedere il mio vecchio post sulla rappresentazione testuale, numerica, duale. Volendo togliere ora, minuti, secondi è sufficiente approssimare per difetto con floor(), come dico più sopra.

EN

QlikView stores dates as the number of days since 30 december 1899. Thus:

  • 2 is 1 jan 1900, at midnight
  • 2.5 is 1 jan 1900, at midday
  • floor(now()) is the same as today() (just slower)
  • ceil(now()) means tomorrow
  • now()+7 means next week at this time
  • payment_date - invoice_due_date is the number of payment delay days
  • today() + 365*4 is not today in 4 years, which in fact is addyears(today(), 4)
  • today() + 30 is probably not this day next month, which is addmonths(today(), 1)
  • 37145 + 0.36575 is almost makedate(2001, 9, 11) + maketime(8, 46, 40) which is '11/09/2001 8.46.40'
  • 39739 is my next birthday

Just a note: date(expression [, format]) doesn't actually modify the date, it justs shows it with a given format. Thus date(now(), 'YYYY-MM-DD') = now() yields true, even if it's not midnight.
If it seems odd to you, see my post about dual().

2 Comments

"39739 è il mio prossimo compleanno"

Tra due giorni sono in ferie e non posso farti gli auguri!
Auguri! :)
Enrico

Grazie Enrico!

Leave a comment

Novità! Se vuoi essere contattato da un consulente Querit lascia nome e numero e Ti telefoneremo:





Pages