2017-10-19 4 views
1

J'ai besoin d'ajouter LAST_DT (fourni en tant que smalldatetime mais sans hhmmss) et LAST_TM (fourni en tant que nvarchar) pour calculer une vraie valeur DateTime.
J'essaie d'utiliser DateAdd pour incrémenter la date fournie avec le hhmmss de LAST_TM. Les heures et les minutes s'ajoutent avec succès, mais les secondes sont arrondies au nombre de minutes. Voici mon codeL'ajout de secondes en utilisant DATEADD renvoie une valeur arrondie en minutes - pourquoi?

DECLARE @LAST_DT smalldatetime = '2017-10-18' 
DECLARE @LAST_TM nvarchar(6) = '153954' 

SELECT 
@LAST_DT 
,@LAST_TM 
,DATEADD(minute, CAST(substring(@LAST_TM,3,2) AS INT), 
    DATEADD(hour, CAST(left(@LAST_TM,2) AS INT),@LAST_DT)) AS Dt_HhMm 
,Right(@LAST_TM,2) As Secs 
,DATEADD(second, CAST(Right(@LAST_TM,2) AS INT), 
    DATEADD(minute, CAST(substring(@LAST_TM,3,2) AS INT), 
    DATEADD(hour, CAST(left(@LAST_TM,2) AS INT),@LAST_DT))) AS Dt_HhMmSs 

et les résultats correspondants

LAST_DT  LAST_TM Dt_HhMm    Secs Dt_HhMmSs 
2017-10-18 153954 2017-10-18 15:39:00 54  2017-10-18 15:40:00 

Pourquoi les secondes étant arrondies à minutes les plus proches?

(j'utilise MS SQL Server 2008 R2)

+0

S'il vous plaît modifier votre question et de fournir un exemple minimal et reproductible. –

+0

@Tim Biegeleisen Je pense que j'ai corrigé cela afin que vous puissiez le reproduire ... – James

Répondre

1

Je suppose que je pratique répondu à ma propre question. LAST_DT est smalldatetime, qui par définition n'inclut pas les secondes. casting LAST_DT comme datetime:

SELECT 
CC.LAST_DT 
,CC.LAST_TM 
,DATEADD(second, CAST(Right(CC.LAST_TM,2) AS INT), 
    DATEADD(minute, CAST(substring(CC.LAST_TM,3,2) AS INT), 
    DATEADD(hour, CAST(left(CC.LAST_TM,2) AS INT),CAST(CC.LAST_DT As datetime)))) 
    AS Dt+HhMmSs 

résout le problème.

Je suis curieux de savoir pourquoi smalldatetime afficherait avec des secondes quand cela ne fait explicitement pas partie du type de données? C'est très confus/trompeur.

+0

Je serais également intéressé de voir si quelqu'un a une meilleure/plus rapide/plus concise façon d'effectuer cette addition pour retourner la valeur de date-heure! – James

+0

'pourquoi smalldatetime afficherait avec des secondes' c'est exactement comme cela que SSMS présente les données – Squirrel

+0

Smalldatetime affiche les secondes car il s'agit de l'affichage par défaut de datetime. Quant à "simplifier", je suppose que vous pourriez utiliser une combinaison de division entière et modulo? par exemple. 'DATEADD (SECOND, LAST_TM/10000 * 3600 + (LAST_TM% 10000)/100 * 60 + LAST_TM% 100, LAST_DT)'. Au moins, cela évite les fonctions de sous-chaîne/fusion. – ZLK

1

vous pouvez simplement convertir LAST_DT en datetime puis ajouter le LAST_TM HH: MM: SS

CONVERT(datetime, CC.LAST_DT) + STUFF(STUFF(CC.LAST_TM, 3, 0, ':'), 6, 0, ':')