3
votes

Comment diviser une variable de type d'heure par 2 dans SQL Server

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!


3 commentaires

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.


5 Réponses :


3
votes

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.


5 commentaires

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.



7
votes

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

db démo violon


2 commentaires

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



5
votes

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))


2 commentaires

@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.



2
votes
DECLARE @TEMPO AS TIME = '01:31:00';
SELECT CONVERT(TIME,DATEADD(SECOND,DATEDIFF(SECOND,'0:0',@TEMPO)/2,'0:0')) AS [RESULT];

0 commentaires

2
votes

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;


0 commentaires