0
votes

Sql Server DateDiff en minutes est différent du TotalMinutes de C #

Dans Sql Server si j'exécute ceci:

DateTime endTime = DateTime.Parse("2019-09-16 10:33:01.000");
DateTime startTime = DateTime.Parse("2019-09-16 10:26:33.000");

int minutes = (int)(endTime - startTime).TotalMinutes;

J'obtiens 7

Mais en C #:

Select DateDiff(mi,'2019-09-16 10:26:33.000', '2019-09-16 10:33:01.000')

Cela renvoie 6. Comment puis-je obtenir une sortie synchronisée dans les deux cas? Je veux que mon code C # renvoie le même que mon serveur SQL - pas seulement dans ce cas, mais dans tous les cas, quelle que soit la date et l'heure utilisées.


2 commentaires

Comment puis-je obtenir une sortie synchronisée dans les deux cas? Créez une nouvelle date avec juste l'année, le mois, le jour, l'heure et les minutes. Puis soustrayez-les. Ou Math.Ceiling plutôt que de transtyper en int.


En SQL, vous arrondissez aux minutes avec 'mi', et en c # vous ne l'êtes pas.


3 Réponses :


3
votes

Essayez plutôt d'utiliser cette méthode Linq:

int minutes = System.Data.Linq.SqlClient.SqlMethods.DateDiffMinute(startTime, endTime);


1 commentaires

Pour info, cela couvre également le mois / jour / année / heures / secondes / millisecondes



0
votes

Les expressions ne sont pas similaires. La première expression que vous obtenez le nombre de minutes entre les 2 datetimes, qui est calculé par le nombre de "ticks". Dans ce cas, vous avez 26 et 33 minutes, donc la valeur des minutes a été "cochée" 7 fois ( 33-26 = 7 ).

Pour l'autre expression, vous soustrayez la valeur la plus récente du plus tôt, puis obtenir le nombre de minutes dans cette valeur. Si C # démarre son horloge en même temps que SQL Server, cela donnerait l'heure 1900-01-01 00: 06: 28.000 ; d'où la raison pour laquelle vous en avez 6.

Si vous voulez la dernière réponse en T-SQL, alors vous feriez quelque chose comme ceci:

SELECT DATEPART(MINUTE,CONVERT(datetime,'2019-09-16T10:33:01.000') - CONVERT(datetime,'2019-09-16T10:26:33.000'));


1 commentaires

J'aimerais vraiment savoir à quoi sert le vote défavorable; comment cette réponse peut-elle être améliorée et qu'est-ce qui ne va pas?



0
votes

Vous tronquez le résultat de (endTime - startTime) .TotalMinutes en le convertissant en un int , ce qui l'arrondit à 6. Le résultat réel de cette instruction est probablement un peu moins de 7 (par exemple 6,999999997). En le convertissant en un int , vous le tronquez (en coupant après la virgule) ce qui donne 6 et non 7.


0 commentaires