2017-10-16 11 views
2

Date d'expiration = '2017-10-16' et ExpiryTime = '12: 00pm 'dans le tableau et dans notre pays La date d'expiration est' 2017-10-16 'et l'heure actuelle est' 2017-10-16 11: 05: 33.503 'Pourquoi mon code exécute-t-il un bloc IF même si la comparaison des dates échoue?

mais encore, mon code exécute la condition IF qu'il ne devrait pas. Pourquoi ?

 Declare @ExpiryDate date 
     Declare @ExpiryTime varchar(10) 

     Set @ExpiryDate= (Select convert(varchar(11), ExpiryDate, 106) from Works where NIT_No= @NITNo and WorkNo= @WorkNo) 
     Set @ExpiryTime= (Select CAST(ExpiryTime as TIME(0)) from Works where NIT_No= @NITNo and WorkNo= @WorkNo) 

     IF(CONVERT(DATETIME,CONVERT(VARCHAR,@ExpiryDate,106)+ ' ' + @ExpiryTime) <= CONVERT(datetime, GETDATE())) 
     Begin 
      RAISERROR('Sorry, Expiry date and time has passed', 16, 10); 
      return; 
     End 
+2

Pourquoi vous utilisez le code de conversion '106' et aussi pourquoi faites tant de conversions entre varchar et la date? –

+0

Je suis confus au sujet de '12:00 pm' ... Je ne peux pas dire si c'est 2017-10-16 matin (0:00) ou 2017-10-17 0:00 ... dans le premier cas, votre 'IF' _is_' vrai'. –

+0

C'est pourquoi vous n'utilisez pas de chaînes pour manipuler les dates! – Alex

Répondre

2

12:00 pm est traduit en 00:00 au format 24 heures. Si vous combinez la date actuelle et 12h00, vous vous attendez à ce que le résultat soit minuit le jour suivant, mais en réalité vous obtenez minuit du jour actuel.

Cela devrait fonctionner:

Declare @ExpiryDate date 
    Declare @ExpiryTime varchar(10) 

    Set @ExpiryDate= (Select convert(varchar(11), ExpiryDate, 106) from Works where NIT_No= @NITNo and WorkNo= @WorkNo) 
    Set @ExpiryTime= (Select CAST(ExpiryTime as TIME(0)) from Works where NIT_No= @NITNo and WorkNo= @WorkNo) 

    declare @dateTimeCombined datetime = dateadd(ms, datediff(ms, '00:00:00', @ExpiryTime), cast(@ExpiryDate as datetime)) 

    IF @dateTimeCombined <= CONVERT(datetime, GETDATE()) 
    Begin 
     RAISERROR('Sorry, Expiry date and time has passed', 16, 10); 
     return; 
    End