2016-08-29 2 views
0

J'ai une table avec date assignée (datetime) et la date résolu (datetime).SQL Server 2012 - temps de calcul écoulé pendant les heures de travail entre les deux datetimes hors week-ends

Je suis en train de calculer le temps (en secondes) écoulé pendant les heures de travail et hors week-ends.

Les heures de travail étant 09: 00: 00.000000 à 17: 30: 00.000000, du lundi au vendredi. Par conséquent, si un projet a été attribué le vendredi à 16h00 00h00 le vendredi et a été résolu le lundi à 10h30 00h00 000000 le temps total écoulé serait de 3 heures ou 180 minutes ou 10 800 secondes.

J'ai vu des messages qui excluaient le temps le week-end, mais travaillent pas des heures --- toute aide est grandement appréciée, merci!

+0

Les heures de travail sont-elles réparées? Ne jamais varier? Sont-ils continus (pas de pause déjeuner)? –

+1

Et pour les vacances? –

+0

Les heures de travail sont fixes et dans ce cas, j'ignore les vacances, merci! – FBeveridge

Répondre

0

Vous pouvez essayer ceci:

select datediff(hh, @d1, @d2) - (datediff(wk, @d1, @d2) * 2 * 8.5) - datediff(dd, @d1, @d2) * (24-8.5) 
+0

Merci @ Polux2 quand je lance ce que je termine avec des entiers négatifs ... pouvez-vous élaborer sur ce que fait cette déclaration? Merci! – FBeveridge

+0

Etes-vous sûr de '@ d2> @ d1'? C'est très bien sur mon ordinateur. Si vous préférez travailler avec des minutes plutôt qu'avec des heures, vous devez remplacer hh par mi, "2 * 8.5" avec "2 * 8.5 * 60" et "(24-8.5)" avec "(24-8.5) * 60" – Polux2

0

Bien qu'il puisse être possible de faire tout cela en une seule expression, je ne voudrais pas essayer. Trop d'erreurs humaines potentielles (y compris des erreurs de transcription), extrêmement longues et difficiles à déboguer ou à modifier. Au lieu de cela, je le ferais comme une fonction définie par l'utilisateur dans T-SQL, si je devais retourner un ensemble de données avec cela déjà calculé. Si je devais l'afficher ou produire un rapport avec cette information, je considérerais le faire dans le code. Mais une fonction T-SQL définie par l'utilisateur sera la solution la plus flexible, je l'accorde.

Je n'ai pas déjà quelque chose comme ça à la main, donc je vais vous donner un algorithme.

Supposons que nous ayons deux valeurs date-heure, @ Date1 et @ Date2. Nous supposerons que @ Date1 < @ Date2. Nous supposerons également que @ Date1 et @ Date2 sont tous deux les jours ouvrables et pendant les heures de travail.

Si @ Date1 et @ Date2 sont à la même date, renvoyez la différence en secondes entre @ Date1 et @ Date2.

Soit @firstMorning soyez le premier 9 heures après @ Date1. Si @ Date1 est sur 9 heures, alors @firstMorning = @ Date1.

Soit @lastMorning être le dernier 9 heures après @firstMorning et avant @ Date2. (Heure de début de @ Date2, fondamentalement.)

Laissez @workWeeks = nombre de semaines du lundi au vendredi entre @firstMorning et @lastMorning.

Soit @firstWeekDays = Nombre de jours entre @firstMorning + vendredi 9h00 de la même semaine. Si @firstMorning = vendredi 9h00, mis @firstWeekDays à 0.

Soit @lastWeekDays = Nombre de jours entre 9h00 lundi de la semaine dernière et @lastMorning. Si @lastMorning = lundi 9h00, définissez @lastWeekDays à 0.

Laissez @SecondsPerDay = 8,5 * 3600.

retour (@workWeeks * 5 * @SecondsPerDay) + (@firstWeekDays * @SecondsPerDay) + (secondes entre @ Date1 et 17h30 sur @ Date1) + (* @lastWeekDays @SecondsPerDay) + (secondes entre @lastMorning et @ Date2)

Notez que cette logique n'a pas été testée avec du code: si c'était le cas, je vous donnerais le code. :)