Press "Enter" to skip to content

SQL – Funzioni di somma sulle date

Oggi mi è stato chiesto come fare usando SQL a fare una serie di calcoli sui tempi, si tratta di una tabella per la registrazione di timbrature da cui poi è necessario trovare il modo di sommare i totali delle ore di un periodo.

Per fare il tutto ho creato la tabella di test e la successiva query di somma.

USE [Paperinik]
GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TbTempi]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[TbTempi](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [StartDate] [datetime] NULL,
    [EndDate] [datetime] NULL,
 CONSTRAINT [PK_TbTempi] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO

SELECT SUM(Datepart(hour,([EndDate]-[StartDate]))) as Ore
,sum(Datepart(minute,([EndDate]-[StartDate]))) as minuti
,CAST(sum(Datepart(minute,([EndDate]-[StartDate]))) AS decimal)/60 as OreParziali
  FROM [Paperinik].[dbo].[TbTempi]

Come potete vedere. in SQL è possibile fare una sottrazione fra due date semplicemente usando l’operatore meno, per poter poi fare delle somme numeriche, possiamo usare la funzione Datepart che permette di ottenere un intero contenente una porzione delle ore memorizzate. Nel mio caso hour per le ore minute per i minuti. Infine, utilizzando la funzione CAST per convertire i minuti interi in decimali, ho generato anche i decimali delle ore.