Comment faire ce calcul mensuel en tenant count du bon nombre de mois en SQL?

DECLARE @InputPeriodStart DATE = '1/1/2014' DECLARE @InputPeriodEnd DATE = '12/31/2014' ROUND(CONVERT(DECIMAL, DATEDIFF(dd, @InputPeriodStart, @InputPeriodEnd)) / 30, 1) AS DECIMAL(18, 2)) 

Le problème ici est que tous les mois n'ont pas 30 jours. Alors, comment puis-je faire fonctionner ce calcul correctement?

Je devrais enlever le ROUND() et ensuite replace le 30 avec le nombre réel de jours pour chaque mois. Je ne suis pas sûr de savoir comment je ferais ça.

Est-ce ce que vous cherchez?

 DATEDIFF(mm, @InputPeriodStart, @InputPeriodEnd)) 

Si vous essayez de faire quelque chose d'un peu plus bizarre comme ajuster pour les jours dans le mois de votre "période de début" est – alors vous entrez dans un territoire étrange, mais il est encore possible. Il suffit de laisser un commentaire pour spécifier.

Modifier:

Jetez un oeil à ce SQLFiddle:

http://sqlfiddle.com/#!6/a1463/7

Cela réalise ce que mon dernier commentaire expose.

Cette réponse est surtout un avertissement à propos de datediff() .

Pour votre exemple, datediff(day, @InputPeriodStart, @InputPeriodEnd) renvoie 11 et non 12. C'est parce que datediff() count le nombre de limites de mois entre les deux valeurs.

Je devine que vous voulez 12. Deux façons que vous pouvez get ceci:

 DATEDIFF(month, @InputPeriodStart, @InputPeriodEnd)) + 1 

ou:

 DATEDIFF(month, @InputPeriodStart, DATEADD(day, 1, @InputPeriodEnd)) 

Ou, si vous ne vous souciez pas du jour spécifique, vous pouvez également effectuer une opération arithmétique sur les valeurs de l'année et du mois:

 (1 + (YEAR(@InputPeriodEnd) * 12 + MONTH(@InputPeriodEnd)) - (YEAR(@InputPeriodEnd) * 12 + MONTH(@InputPeriodStart)) ) 

La sémantique de DATEDIFF() peut être un peu confuse. La définition est correcte (en général) pour les secondes et lors de l'utilisation du day pour les dates. À d'autres moments, cela peut entraîner des erreurs randoms difficiles à détecter et à résoudre.