salve,
questo tipo di dato e' sempre stato.... "stupido", a mio punto di vista.... :)
e' "parte" di un DATETIME, nel senso che indica un momento puntuale nell'asse temporale, e niente piu' di questo...
e' bello pensare di utilizzarlo come un TimeSpan/Durantion, quindi una "durata temporale", ma invece indica SOLO un orario.... punto... quindi
SELECT '13:11:59';
indica SOLO il momento delle ore 13, 11 minuti e 59 secondi...
se quindi la colonna indica "l'orario" di evenienza di un qualche cosa, ok, diversamente, se deve invece indicare un tempo di durata, personalmente preferirei utilizzare la sua "rappresentazione" in minuti, o secondi, o decimi come magari richiesto per la precisione a te necessaria.... operando ad esempio in "secondi", avresti nella colonna un valore tipo 47519 secondi (un numero intero)... e operando matematicamente sai che il modulo 60 del valore rappresenta i secondi, il modulo 3600 del valore / 60 corrisponde alle ore, e finalmente il valore / 3600 indica le ore... qui puoi poi operare come meglio ti aggrada... aggiungere ad esempio un coefficiente di 1,22 [come l'IVA :)] al tuo valore, e avere nuovamente una rappresentazione in versione "ore/minuti/secondi" quando ti interessa...
trivialmente:
SET NOCOUNT ON;
DECLARE @t time(7) = '13:11:59';
SELECT @t AS [Tempo Puntuale]
PRINT 'NESSUNA OPERAZIONE TENDENZIALMENTE EFFETTUABILE.... il valore rappresenta un punto nel tempo...';
PRINT REPLICATE('-', 50);
PRINT 'operiamo invece su un intero, che definisce un determinato numero di secondi relativi alla durata di un evento';
DECLARE @sec int = 47519;
SELECT (@sec / 3600) AS [Ore],
(@sec % 3600) / 60 AS [Minuti],
(@sec % 60) AS [Secondi];
PRINT 'ergo';
SELECT CONVERT(varchar(10), (@sec / 3600)) + ' Ore '
+ CONVERT(varchar(10),(@sec % 3600) / 60) + ' Minuti '
+ CONVERT(varchar(10),(@sec % 60)) + ' Secondi';
GO
PRINT REPLICATE('-', 50);
PRINT 'coefficiente 1.22 da aggiungere';
DECLARE @coeff decimal(3,2) = 1.22;
DECLARE @sec int = 47519;
SELECT @sec = @sec * @coeff;
SELECT @sec AS [Valore derivante];
SELECT (@sec / 3600) AS [Ore],
(@sec % 3600) / 60 AS [Minuti],
(@sec % 60) AS [Secondi];
PRINT 'ergo';
SELECT CONVERT(varchar(10), (@sec / 3600)) + ' Ore '
+ CONVERT(varchar(10),(@sec % 3600) / 60) + ' Minuti '
+ CONVERT(varchar(10),(@sec % 60)) + ' Secondi';
--<-------------
Tempo Puntuale
----------------
13:11:59.0000000
NESSUNA OPERAZIONE TENDENZIALMENTE EFFETTUABILE.... il valore rappresenta un punto nel tempo...
--------------------------------------------------
operiamo invece su un intero, che definisce un determinato numero di secondi relativi alla durata di un evento
Ore Minuti Secondi
----------- ----------- -----------
13 11 59
ergo
---------------------------------------------------
13 Ore 11 Minuti 59 Secondi
--------------------------------------------------
coefficiente 1.22 da aggiungere
Valore derivante
----------------
57973
Ore Minuti Secondi
----------- ----------- -----------
16 6 13
ergo
---------------------------------------------------
16 Ore 6 Minuti 13 Secondi
per tua maggiore informazione leggi ad esempio anche http://www.sqlteam.com/article/working-with-time-spans-and-durations-in-sql-server
salutoni