martedì 21 maggio 2013

Gestione date con MSSQL 2005

MSSQL - 2005 - Come calcolare range di date variabili tramite semplici query

 
Un piccolo post per prendere appunti su come eseguire query con range di date "dinamiche" in MSSQL 2005
 
Vediamo di spiegare meglio la situazione.
 
Il capo vorrebbe avere una estrazione del fatturato con i dati espressi nel seguente modo:
 
 
  1. Il fatturato a montante dal primo dell'anno alla fine del mese precedente la data di estrazione, sia per l'anno in corso, sia per l'anno precedente.
  2. Il fatturato calcolato dal primo all'ultimo giorno del mese precedente a quello dell'estrazione, sia per l'anno in corso che per l'anno precedente.
  3. Il fatturato del mese in corso, per l'anno in corso e per l'anno precedente.
Quindi, ipotizzando che oggi sia il 21 maggio del 2013 i punti sopra si tradurrebbero in :
 
  1. Il fatturato a montante dal 01/01/2013 al 30/04/2013 e il fatturato a montante dal 01/01/2012 al 30/04/2012
  2. Il fatturato dal 01/04/2013 al 30/04/2013 e dal 01/04/2012 al 30/04/2012
  3. il fatturato calcolato dal 01/05/2013 al 21/05/2013 e dal 01/05/2012 al 21/05/2012
Per risolvere la questione ho costruito un report nel quale le date vengono calcolate utilizzando le funzioni DATEADD e DATEDIFF

In pratica, per trovare:

  • Il primo di gennaio, ovvero il primo giorno dell'anno in corso possiamo usare
    • dateadd(month, datediff(month, 0,getdate())-month(getdate())+1,0)  che restituisce la data del 01/01/2013
  • L'ultimo giorno dell'anno in corso
    • dateadd(month,datediff(month,0,getdate())+13-month(getdate()),-1) che restituisce la data del 31/12/2013
  • Il primo giorno dell'anno precedente
    • dateadd(year,-1,dateadd(month, datediff(month, 0,getdate())-month(getdate())+1,0))  che restituisce la data del 01/01/2012
  • L'ultimo giorno dell'anno precedente
    • dateadd(year,-1,dateadd(month,datediff(month,0,getdate())+13-month(getdate()),-1)) che restituisce la data del 31/12/2012
  • Il primo giorno del mese precedente a quello dell'estrazione per l'anno in corso
    • dateadd(month,datediff(month,0,getdate())-1,0) che restituisce la data del 01/03/2013
  • L'ultimo giorno del mese precedente a quello dell'estrazione per l'anno in corso
    • dateadd(month,datediff(month,0,getdate()),-1) che restituisce la data del 31/03/2013
  • Il primo giorno del mese precedente a quello dell'estrazione per l'anno precedente
    • dateadd(year,-1,dateadd(month,datediff(month,0,getdate())-1,0))  che restituisce la data del 01/03/2012
  • L'ultimo giorno del mese precedente a quello dell'estrazione per l'anno precedente
    • dateadd(year,-1,dateadd(month,datediff(month,0,getdate()),-1)) 
E così di seguito... Con tali combinazioni di funzioni si possono ricavare quasi tutte le date all'interno dell'anno partendo dall'unica costante che è la data in cui si effettua l'estrazione. 


Si noti che l'utilizzo del comando DATEDIFF annidiato nella query serve in quanto restituisce una data nel formato dd-mm-yyyy 00:00:00.000. Se avessi usato il solo comando DATEADD, avrei avuto come risultato una data nel formato dd-mm-yyyy 15:45:26.985 (ovvero con il calcolo della data corretto, ma con l'ora esatta dell'estrazione). E questo potrebbe essere un problema, in quanto se l'estrazione è fatta alle 15.00.00.000 del pomeriggio, i dati registrati prima delle 15:00:00.000 del pomeriggio non sarebbero ricompresi nel risultato.

L'articolo è presente anche nel mio BLOG di SAP B1 a questo indirizzo



 




Nessun commento:

Posta un commento

Grazie per aver scritto.

Il tuo commento sarà pubblica appena approvato dall'amministratore del blog.