Le calcul des jours à l'exclusion des fins de semaine (lundi au vendredi) dans SQL Server
Comment puis-je calculer le nombre de jours ouvrés entre deux dates de table (de la 1ère ligne à la fin) dans SQL Server 2008?
J'ai essayé quelque chose comme ça, mais il ne fonctionne pas
DECLARE @StartDate as DATETIME, @EndDate as DATETIME
Select @StartDate = date2 from testtable ;
select @EndDate = date1 from testtable ;
SELECT
(DATEDIFF(dd, @StartDate, @EndDate) + 1)
-(DATEDIFF(wk, @StartDate, @EndDate) * 2)
-(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END)
- stackoverflow.com/questions/1803987/...
- pense que c'est de ne pas essayer, j'ai Date1 = 2013-09-24 19:26:39 et Date2 = 2013-09-26 16:29:31 où Date1 et Date2 dynamique de la date
- Nous utilisons toutes les dates contenant la table pour de telles tâches. Genrally nous le lien vers ce tableau comme "datestable.date entre startdate et enddate" et de ne compter que les dates (enregistrements), à partir des dates de la table, où les conditions (comme la date de la journée de travail) sont remplies.
Vous devez vous connecter pour publier un commentaire.
Je recommande toujours une Calendrier de table, alors il suffit d'utiliser:
Depuis SQL n'a pas connaissance de jours fériés par exemple le nombre de jours ouvrés entre deux dates ne représentent pas toujours le nombre de jours de travail. C'est pourquoi un calendrier de table est un must pour la plupart des bases de données. Ils ne prennent pas beaucoup de mémoire et de simplifier beaucoup de requêtes.
Mais si ce n'est pas une option, alors vous pouvez générer un tableau de dates relativement facilement à la volée et l'utilisation de cette
MODIFIER
Si vous devez calculer la différence entre les deux colonnes de date, vous pouvez toujours utiliser votre calendrier de table de la manière suivante:
Exemple sur SQL-Violon
@d1
et@d2
, mais pas entre les dates de votre tableau (date1 et date2), c'est pourquoi vous obtenez le même nombre répété dans toutes les lignes.Cela ne il excluant les jours, mais la date dans la partie plutôt que de description. Vous pouvez remplacer les paramètres utilisés comme un exemple pour les valeurs de votre requête.
À ajouter à GarethD réponse - j'ai mis en place le SQL pour les états-unis, version du Calendrier de la table, avec tous les jours fériés et les week-ends ensemble de is_working_day = false... pour quelqu'un qui serait comme le SQL, c'est ici:
Vous Pouvez simplement utiliser la fonction datediff de sql. et puis vous pouvez soustraire les week-ends entre ces deux dates, le cas échéant. Par exemple, vérifiez ci-dessous requête.
Vous pouvez également calculer les jours fériés de début/date de fin et peut la déduire de la sélection finale.
JS:
Question intéressante. Il est toujours important de comprendre les cas d'utilisation. Si à compter de dimanche à lundi, voulons-nous dire qu'il n'y est un jour comme si nous avions jusqu'à la fermeture des affaires le lundi. Ou aurions-nous envie de dire il n'y a pas de jours comme s'il n'y avait pas de jours avant le lundi a commencé. Dans notre cas, nous avons besoin de compter deux jours (début et fin) s'ils ont été les jours de la semaine, parce que je travaillais dans une application de paie de l'estimation de certaines charges à payer. Et toute la journée le week-end jours plus tard être représenté par des vacances, d'heures supplémentaires et d'enregistrements.
Quand je suis sorti de mon calendrier, j'ai réalisé que lorsque le comptage à partir de samedi ou dimanche seulement nous pouvions commencer à compter à partir de lundi. Et aussi lors de la comptabilisation d'un samedi ou un dimanche, je pouvais juste arrêter de compter quand nous sommes arrivés à vendredi. J'ai donc écrit une fonction qui ajuste le début et date de fin, le nombre de semaines en divisant par 7, multiplié par 5 jours de la semaine par semaine et ensuite ajoutée le reste. J'ai dû en compte le cas lorsque nous avons commencé à compter sur un week-end, mais n'a jamais eu à lundi.
-- =============================================
-- Auteur: Todd P Payne
-- Date de création: 9/1/2018
-- Description: Compte le nombre de jours ouvrés entre deux dates
- Contrairement à DateDiff StartDate et EndDate inclusive
- À PARTIR de lundi, du 1er janvier au lundi 1er Jan sera de retour 1
-- =============================================
CRÉER la FONCTION [dbo].[ufnCountWeekdays]
(
- Ajouter les paramètres de la fonction ici
@StartDate DateTime,
@EndDate DateTime
)
RETOURNE INT
COMME
COMMENCER
-- Déclarer la variable de retour ici
DECLARE @CountofWeekDays INT = NULL;
DECLARE @TempDate DateTime;
FIN
ALLER
Heureux De Codage
Todd P Payne