Come lavorare con le date in sql

Molte volte ci si ritrova a fare i “conti” con le date e quindi con questo prontuario spero di fare chiarimenti su come si possono ottenere delle date di rifermento indietro eo avanti rispetto a oggi o a una determinata data.

Partiamo da alcune date riferite alla giornata odierna:

–Oggi
SELECT GETDATE()
–Ieri
SELECT DATEADD(d,-1,GETDATE())
–Domani
SELECT DATEADD(d,+1,GETDATE())

Ora vediamo dei giorni riferiti alla settimana corrente:

–Primo giorno della Settimana corrente
SELECT DATEADD(wk,DATEDIFF(wk,0,GETDATE()),0)
–Ultimo giorno della Settimana corrente
SELECT DATEADD(wk,DATEDIFF(wk,0,GETDATE()),6)
–Primo giorno della Settimana precedente
SELECT DATEADD(wk,DATEDIFF(wk,7,GETDATE()),0)
–Ultimo giorno della Settimana precedente
SELECT DATEADD(wk,DATEDIFF(wk,7,GETDATE()),6)

Riferiamoci ora al mese corrente:

–Primo giorno del Mese corrente
SELECT DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)
–Ultimo giorno del Mese corrente
SELECT DATEADD(ms,-
3,DATEADD(mm,0,DATEADD(mm,DATEDIFF(mm,0,GETDATE())+1,0)))
–Primo giorno del Mese precedente
SELECT DATEADD(mm,-1,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0))
–Ultimo giorno del Mese precedente
SELECT DATEADD(ms,-3,DATEADD(mm,0,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)))

Ed infine all’anno corrente:

–Primo giorno del anno corrente
SELECT DATEADD(yy,DATEDIFF(yy,0,GETDATE()),0)
–Ultimo giorno del anno corrente
SELECT DATEADD(ms,-3,DATEADD(yy,0,DATEADD(yy,DATEDIFF(yy,0,GETDATE())+1,0)))
–Primo giorno del anno precedente
SELECT DATEADD(yy,-1,DATEADD(yy,DATEDIFF(yy,0,GETDATE()),0))
–Ultimo giorno del anno precedente
SELECT DATEADD(ms,-3,DATEADD(yy,0,DATEADD(yy,DATEDIFF(yy,0,GETDATE()),0)))

Ovviamente combinando  queste formule all’interno delle vostre query potete ottenere buoni risultati, ad esempio nel mio caso dovevo estrarre tutti i movimenti gestionali da oggi a 6 mesi indietro ma partendo sempre dal primo del mese, quindi se oggi è il 15/06/12 dovevo prendere tutti i movimenti dal 01/01/2012.

Trovare record duplicati in una tabella

Per trovare un record duplicato all’interno di una tabella non è una impresa semplice ma per fortuna ho trovato in rete questo comando sql che fa perfettamente il suo lavoro. L’esempio è per il confronto di un campo ma con una semplice concatenazione si può utilizzare per confrontare un insieme di campi che risultano doppi. Nel mio caso l’ho utilizzato per confrontare 4 campi se risultassero doppi facendo un concatenamento.

SELECT tab.campo_da_esaminare FROM tabella AS tab INNER JOIN (SELECT campo_da_esaminare FROM tabella GROUP BY campo_da_esaminare HAVING COUNT(campo_da_esaminare)>1) AS dup ON dup.campo_da_esaminare = tab.campo_da_esaminare;