SQL Server: fonction datediff a entraîné un dépassement de capacité lors de l'utilisation de la MILLISECONDE
J'ai la requête suivante :
select CONVERT(varchar(12), DATEADD(MILLISECOND, DateDiff(MILLISECOND, '2014-08-04 10:37:28.713','2014-11-04 08:21:17.723'), 0), 114)
Lorsque j'exécute ceci, j'obtiens l'erreur :
"La fonction datediff a entraîné un dépassement de capacité. Le nombre de dateparts séparant deux date/heure de cas est trop grand. Essayez d'utiliser datediff avec un moins précis datepart."
Lorsque je change la requête à la suivante, il fonctionne très bien :
select CONVERT(varchar(12), DATEADD(SECOND, DateDiff(SECOND, '2014-08-04 10:37:28.713','2014-11-04 08:21:17.723'), 0), 114)
Le problème est que j'ai vraiment besoin de MILLISECONDES.
DATEDIFF retourne un entier, ce qui n'est tout simplement pas assez grand pour contenir le résultat. La seule façon que je peux penser serait pour savoir combien de jours il y a entre les deux dates, puis faire une comparaison uniquement sur les portions du temps des deux dates pour savoir combien de millisecondes de différence il y a, et ajouter les deux ensemble (en multipliant le nombre de jours par le nombre de millisecondes dans une journée).
Remarque: vous travaillez dans un domaine qui s'applique à certains type de l'heure d'été? Parce que dans beaucoup d'endroits, il y a eu une transition entre on/off de l'heure d'été au cours de la période, vous êtes en train de regarder et SQL Server ne sera pas le prendre en compte. Donc, vous pourriez vous retrouver avec un résultat qui est "exacte" de l'ordre de la milliseconde, mais par une heure entière.
avez la réponse à résoudre votre problème ? Si oui, veuillez l'accepter
c'est pourquoi vous devriez normaliser la date de l'information sur la DB niveau record, et de les transformer de manière appropriée dans la présentation à la locale de l'utilisateur.
Remarque: vous travaillez dans un domaine qui s'applique à certains type de l'heure d'été? Parce que dans beaucoup d'endroits, il y a eu une transition entre on/off de l'heure d'été au cours de la période, vous êtes en train de regarder et SQL Server ne sera pas le prendre en compte. Donc, vous pourriez vous retrouver avec un résultat qui est "exacte" de l'ordre de la milliseconde, mais par une heure entière.
avez la réponse à résoudre votre problème ? Si oui, veuillez l'accepter
c'est pourquoi vous devriez normaliser la date de l'information sur la DB niveau record, et de les transformer de manière appropriée dans la présentation à la locale de l'utilisateur.
OriginalL'auteur Bart Schelkens | 2014-11-04
Vous devez vous connecter pour publier un commentaire.
Pour la milliseconde, la différence maximale entre startdate et enddate est de 24 jours, 20 heures, 31 minutes et 23.647 secondes. voir http://msdn.microsoft.com/en-us/library/ms189794.aspx
Si vous avez besoin de la milliseconde au-dessus de ce niveau, vous aurez besoin d'écrire quelque chose de personnalisé.
OriginalL'auteur Marcel Dumont
Un peu plus tard, mais la réponse peut aider.
Dans SQL 2016 MS introduit la fonction DATEDIFF_BIG qui (selon le type de taille) de débordement dans la différence plus grande que quelque chose comme 290k ans. Mais l'article technet ont la même différence de temps de base DATEDIFF - https://msdn.microsoft.com/en-us/library/mt628058.aspx
OriginalL'auteur jarabizna
Vous n'avez pas besoin de se référer à la milisecondes dans votre calcul.
Cela va faire exactement la même que celle de votre script à l'exception de la overflow:
OriginalL'auteur t-clausen.dk
Pour moi, il y a un grand intervalle de temps entre deux dates, donc j'ai utilisé le code ci-dessous
Cela fonctionne pour moi .
OriginalL'auteur Ashwini Jindal
Dans SQL Server 2016, il y a une nouvelle fonction disponible: DATEDIFF_BIG
Il permet de résoudre exactement le problème de débordement.
OriginalL'auteur tomfroehle