Je dois calculer la différence entre StartTime et EndTime. Si le EndTime est inférieur à 15 minutes de celui de StartTime, je dois afficher une erreur.

CREATE PROCEDURE [Travel].[TravelRequirementValidate] 
@Action char(1)
,@CallId int
,@PhaseId int
,@ShipId int 
,@CallStartDate datetime
,@CallEndDate DATETIME
,@CallStartTime datetime 
,@CallEndTime datetime   
,@LanguageId int
,@SessionGroup nvarchar(100)
,@SessionPlace nvarchar(100)
,@ActiveFlg tinyint
,@WarningMessage nvarchar(300)=NULL output
,@Minutes int 
as
if @Action in ('I','U')
begin
   @Minutes=select DATEDIFF(@CallStartDate,@CallStartTime,@CallEndTime) from [Travel].[TravelRequirement] 
if @Minutes<=15
begin
  raiserror(3,11,1) --CallEndTime must be equals or higher than 15 minutes
  return
end
end

Ce code ne fonctionne pas. J'ai une erreur pour le premier paramètre de DATEDIFF (paramètre invalide 1 spécifié pour dateiff).

Comment puis-je réparer mon code?

MODIFIER

J'ai changé @ Minutes = sélectionnez DATEDIFF (@ CallStartDate, @ CallStartTime, @ CallEndTime) de [Travel]. [TravelRequirement]

Dans

declare @Diff int
@Diff=select DATEDIFF(@Minutes,@CallStartTime,@CallEndTime) from [Travel].[TravelRequirement] 

Mais j'ai la même erreur

0
Matteo 23 mai 2018 à 15:33

3 réponses

Meilleure réponse

La fonction DATEDIFF veut comme premier paramètre la portion de temps.

Son utilisation correcte est:

DATEDIFF(minute, @CallStartTime, @CallEndTime)
2
Joe Taras 23 mai 2018 à 12:45

La syntaxe correcte pour cette expression serait:

select @Minutes = datediff(minute, @CallStartTime, @CallEndTime)
from [Travel].[TravelRequirement];

Cependant, cela n'a pas de sens, car - vraisemblablement - le tableau comporte plusieurs lignes. Quelle rangée voulez-vous?

1
Gordon Linoff 23 mai 2018 à 12:45

Je suggérerais d'utiliser les secondes et de diviser par 60,0 - fournit un résultat plus précis:

select @Minutes = datediff(second, @CallStartTime, @CallEndTime)/60.0
from [Travel].[TravelRequirement];
1
Tyron78 23 mai 2018 à 12:48