J'ai une variable de type TIME
, je dois diviser le temps de cette variable par 2.
Mon code SQL:
DECLARE @TEMPO AS TIME = '01:31:00' SELECT (@TEMPO / 2 ) AS RESULT --the result should be: 00:45:30
SQL Server renvoie cependant une erreur:
Clash de type opérande: le temps est incompatible avec int
Toute aide est la bienvenue!
5 Réponses :
Le type de données d'heure représente une heure de la journée , pas une durée ou une durée .
Vous ne pouvez pas diviser une heure de la journée par un entier, ce n'est pas un concept qui a du sens. Qu'est-ce que 2 heures divisé par 2?
Si vous essayez de représenter une durée ou une quantité de temps, stockez-la sous forme d'entier de votre niveau de granularité le plus bas, puis divisez-la. Ensuite, si vous le souhaitez, vous pouvez l'afficher dans une chaîne formatée Heures: Minutes.
Avez-vous des conseils sur la façon de convertir le type INT en TIME?
J'ai le sentiment que c'est une question XY. Dites-moi d'abord pourquoi vous pensez que vous voulez convertir INT en TIME.
parce que la table de données a la colonne TIME, je ne peux pas changer le type de colonne car un système de production qui écrit ces informations. Je crée juste un rapport de sortie.
Alors, n'avez-vous pas réellement besoin de convertir TIME en INT?
La réponse de @John Cappelletti résout mon problème, convertit TIME en FLOAT.
Utilisation de TIMEFROMPARTS
(SQL Server 2012+):
DECLARE @TEMPO AS TIME = '01:31:00'; DECLARE @i INT = DATEDIFF(s, '00:00:00',@TEMPO)/2; SELECT TIMEFROMPARTS(@i/3600%60, @i/60%60 ,@i%60,0,0); -- 00:45:30
Merci pour la réponse, dans le travail de violon parfait, mais dans mon SQL Server 2008 R2 renvoie une erreur: «DATEFROMPARTS» n'est pas un nom de fonction intégré reconnu.
@sergioBertolazzo TIMEFROMPARTS est disponible à partir de SQL Server 2012. Veuillez envisager la mise à niveau avant juillet: microsoft.com/en-us/sql-server/sql-server-2008
Une autre option consiste à convertir l'heure en datetime
puis en float
, puis diviser par deux.
00:45:30.0000000
DECLARE @TEMPO AS TIME = '01:31:00' Select convert(time,convert(datetime,convert(float,convert(datetime,@Tempo))/2))
@sergioBertolazzo Heureux de vous aider
@LukaszSzozda Merci ... Je n'ai jamais compris pourquoi nous ne pouvons pas convertir le temps en flotteur. Après tout, ce ne serait qu'une représentation décimale de 24 heures.
DECLARE @TEMPO AS TIME = '01:31:00'; SELECT CONVERT(TIME,DATEADD(SECOND,DATEDIFF(SECOND,'0:0',@TEMPO)/2,'0:0')) AS [RESULT];
Vous pouvez convertir l'heure en un nombre entier de millisecondes à l'aide de DateDiff
, effectuer l'arithmétique, puis utiliser DateAdd
pour reconvertir en Heure code>:
declare @Tempo as Time = '01:31:00';
select @Tempo as Tempo;
set @Tempo = DateAdd( ms, DateDiff( ms, 0, @Tempo ) / 2, 0 );
select @Tempo as HalfTempo;
Si l'heure est: 01:31:00 Le résultat sera: 00:45:30
Je pense que votre TEMPS est peut-être écoulé? alors ce n'est pas un type de données temporel, vous utiliserez int, ou quelque chose de différent
La réponse de @John Cappelletti résout mon problème, convertit TIME en FLOAT.