T-SQL obtenir le nombre de jours ouvrés entre 2 dates
Je veux calculer le nombre de jours ouvrés entre 2 dates. Par exemple, si je veux calculer le nombre de jours ouvrables entre 2013-01-10 et 2013-01-15, le résultat doit être de 3 jours de travail (je ne prends pas en compte le dernier jour dans cet intervalle et je soustrais les samedis et dimanches). J'ai le code suivant qui fonctionne dans la plupart des cas, à l'exception de celui dans mon exemple.
SELECT (DATEDIFF(day, '2013-01-10', '2013-01-15'))
- (CASE WHEN DATENAME(weekday, '2013-01-10') = 'Sunday' THEN 1 ELSE 0 END)
- (CASE WHEN DATENAME(weekday, DATEADD(day, -1, '2013-01-15')) = 'Saturday' THEN 1 ELSE 0 END)
Comment puis-je accomplir? Dois-je passer par tous les jours et de les vérifier? Ou est-il un moyen facile de le faire.
Comment allez-vous tenir compte des jours fériés qui n'est pas un week-end?
double possible de Nombre de jours de travail entre les deux dates
double possible de Nombre de jours de travail entre les deux dates
OriginalL'auteur Rocshy | 2013-02-07
Vous devez vous connecter pour publier un commentaire.
S'il vous plaît, s'il vous plaît, veuillez utiliser un calendrier de table. SQL Server ne sait rien sur les jours fériés, événements d'entreprise, de catastrophes naturelles, etc. Un calendrier de table est assez facile à construire, prend une très faible quantité d'espace, et sera dans la mémoire si elle est référencée assez.
Voici un exemple qui crée un calendrier de table avec 30 ans de dates (2000 -> 2029), mais requiert seulement 200 KO sur le disque (136 KO si vous utilisez la compression de page). C'est presque assuré d'être inférieure à l'allocation de la mémoire nécessaire pour traiter un CTE ou d'un autre à l'exécution.
Maintenant la requête que vous êtes après est assez simple à écrire:
Plus d'infos sur les agendas:
http://web.archive.org/web/20070611150639/http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html
Plus d'infos sur les groupes électrogènes sans boucles:
http://www.sqlperformance.com/tag/date-ranges
Aussi se méfier de ce genre de petites choses en s'appuyant sur la version anglaise de la sortie de
DATENAME
. J'ai vu plusieurs applications pause parce que certains utilisateurs avaient un autre paramètre de langue, et si vous êtes en s'appuyant surWEEKDAY
assurez-vous de configurer votreDATEFIRST
paramètre de façon appropriée...OriginalL'auteur Aaron Bertrand
Pour des trucs comme ça, j'ai tendance à tenir à jour un calendrier de table qui comprend également les jours fériés etc.
Le script que j'utilise pour ce est comme suit (Notez que je n'ai pas l'écrire @ je ne sais plus où je l'ai trouvé)
Une fois que vous avez créé la table, de trouver le nombre de jours de travail est simple comme bonjour:
Noter que ce script contient royaume-UNI, les jours fériés, je ne sais pas dans quelle région vous êtes.
ISO_WEEK
comme un paramètre dansDATEPART
, ce sera plus efficace qu'un UDF.Je suis d'accord, mais comme vous le savez, ce n'est exécuté qu'une fois, une fois le calendrier de table a été construite la fonction est ignorée et jamais utilisé, pour citer Clarke Gable “Franchement, ma chère, je ne donne pas une merde” lol
Votre requête à la fin utilise
BETWEEN
, et cela donne 4 lignes. L'OP a déclaré qu'ils avaient besoin de jeter le dernier jour de la gamme, de sorte que la requête doit être à l'aide de >= et <. Aussi pourquoi ne pas utiliser les formats de date (commeYYYYMMDD
), de sorte que vous n'avez pas à faire tout ce qu'convertir des trucs? sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/... sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/...si vous parcourez les questions que j'ai posées, vous trouverez une meilleure iso_week fonction
OriginalL'auteur HeavenCore
Voici une simple fonction qui compte les jours ouvrables, non compris le samedi et le dimanche (lors du décompte des jours fériés n'est pas nécessaire):
OriginalL'auteur SHennessy
C'est la méthode que j'ai l'habitude d'utiliser (si vous n'utilisez pas un calendrier de table):
Si comme moi, vous avez un tableau avec les jours fériés, vous pouvez ajouter ce dans de trop:
Le ci-dessus ne fonctionnera que si vos dates sont dans 2047 jours les uns des autres, si vous êtes susceptible d'être le calcul des plus grandes plages de dates vous pouvez utiliser ceci:
OriginalL'auteur GarethD
J'ai fait de mon code dans SQL SERVER 2008 (MS SQL) . Il fonctionne très bien pour moi. J'espère que ça va vous aider.
OriginalL'auteur KESAVAN PURUSOTHAMAN