2
votes

Renvoie DATEDIFF en millisecondes sur SQL Server 2008R2

J'ai une requête SQL renvoyant une valeur pour x, qui est un horodatage, mappé à un objet C # de type long:

SELECT DATEDIFF(second, { d '1970-01-01'}, dateCompleted) * 1000 AS x

L'instruction ci-dessus fonctionne . Cependant, j'ai besoin d'obtenir l'horodatage pour renvoyer la valeur en millisecondes plutôt qu'en secondes. Dans SQL Server 2016, je peux faire ceci:

SELECT DATEDIFF_BIG(millisecond, { d '1970-01-01'}, dateCompleted) AS x

... et cela fonctionne très bien. Cependant, je suis bloqué sur SQL Server 2008 R2.

Je pourrais renvoyer les valeurs et effectuer un post-traitement en C # pour multiplier x par 1000 mais je me suis demandé s'il y avait un moyen de gérer cela dans la requête lui-même. J'ai essayé une simple multiplication mais cela génère une erreur de dépassement arithmétique :

SELECT DATEDIFF(second, { d '1970-01-01'}, dateCompleted) AS x

Quelqu'un pourrait-il suggérer comment y parvenir?

Merci.


1 commentaires

* 1000.0 AS x


4 Réponses :


1
votes

Que diriez-vous d'utiliser cast () ou convert()?

SELECT DATEDIFF(second,{ d '1970-01-01'},dateCompleted) * convert(bigint, 1000) AS x


0 commentaires

0
votes

Peut-être une variable?

DECLARE @milli BIGINT;

SET @milli = DATEDIFF(second,{ d '1970-01-01'},dateCompleted) * 1000.0;

SELECT @milli;


0 commentaires

0
votes

Datediff renvoie la valeur int, donc la seconde aura un problème avec le type de données int.

vous pouvez obtenir les minutes ou les jours et plusieurs avec 60 pour obtenir des secondes

SELECT DATEDIFF (m, {d '1970-01-01'}, getdate ()) * 1000 * 60


0 commentaires

2
votes

DATEDIFF renvoie un INT donc il ne peut pas être utilisé pour renvoyer la différence en millisecondes si les deux dates sont éloignées (environ 25 jours) l'une de l'autre. Cependant, vous pouvez calculer la différence en secondes, multiplier BIGINT par 1000 et ajouter les millisecondes:

SELECT DATEDIFF(SECOND, '1970-01-01', dateCompleted)
     * CAST(1000 AS BIGINT)
     + DATEPART(MILLISECOND, dateCompleted)

En supposant que vous vouliez un horodatage UNIX , vous devez également ajouter le décalage du fuseau horaire au résultat (j'espère que vous l'avez stocké avec la date de fin).


0 commentaires