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.
3 Réponses :
Essayez plutôt d'utiliser cette méthode Linq:
int minutes = System.Data.Linq.SqlClient.SqlMethods.DateDiffMinute(startTime, endTime);
Pour info, cela couvre également le mois / jour / année / heures / secondes / millisecondes
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'));
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?
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.
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. OuMath.Ceilingplutôt que de transtyper en int.En SQL, vous arrondissez aux minutes avec 'mi', et en c # vous ne l'êtes pas.