2017-10-09 2 views
2

Nous avons une table qui contient des ressources et les jours de travail. Par exemple, une personne pourrait travailler du lundi au vendredi, mais une autre ne pourrait travailler que deux jours par semaine. Voici les données: (. Excuses pour le manque de mise en forme, mais des captures d'écran télécharger wont par notre proxy putain)SQL - Trouver des jours ouvrables à partir des jours travaillés

WorkOnSunday WorkOnMonday WorkOnTuesday WorkOnWednesday WorkOnThursday WorkOnFriday WorkOnSaturday 
-------------------------------------------------------------------------------------------------------------- 
0    1    1    1    1    1    0 
0    0    1    1    0    0    0 

La question est, comment puis-je obtenir la quantité de jours travaillés dans un mois en utilisant les données ci-dessus? (Les vacances sont la prochaine étape je tente de mettre la main sur la table des vacances que nous avons apparemment.)

Voici ce que j'ai jusqu'à présent:

DECLARE @StartDate DATETIME 
DECLARE @EndDate DATETIME 
SET @StartDate = '2017/12/01' 
SET @EndDate = '2018/01/01' 


SELECT 
    (DATEDIFF(dd, @StartDate, @EndDate)) 
    -(DATEDIFF(wk, @StartDate, @EndDate) * 2) 
    -(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END) 
    -(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END) 

Cela me donne le montant exact des jours de la semaine dans le mois

+0

cela pourrait faire avec normalisant. Avoir une sous-table avec les champs suivants à la place: "ID de ressource", "DayOfWeek", "Works" (où Works est un champ booléen 0/1 et "DayofWeek" est un nombre représentant le jour de la semaine. composé d'ID de ressource et de jour de la semaine, ce qui devrait faciliter l'écriture de requêtes utiles relatives à ces données, par exemple, les dates de début et de fin pour vous permettre de comprendre les changements de fonctionnement. Ce que vous avez maintenant est inflexible et ne vous permettra pas d'obtenir les informations dont vous avez besoin, pas facilement de toute façon – ADyson

+0

Il semble que des informations importantes manquent dans votre première table - en particulier l'ID de ressource et la date de début ou de fin. – Greenspark

+0

Postez votre structure de table correcte – Amit

Répondre

1

vous devez d'abord savoir combien de chaque jour se produit dans votre mois,
la requête suivante peut vous aider avec cela.

declare @from datetime= '2017/12/01' 
declare @to datetime = '2018/01/01' 

select 
datediff(day, -7, @to)/7-datediff(day, -6, @from)/7 AS MON, 
datediff(day, -6, @to)/7-datediff(day, -5, @from)/7 AS TUE, 
datediff(day, -5, @to)/7-datediff(day, -4, @from)/7 AS WED, 
datediff(day, -4, @to)/7-datediff(day, -3, @from)/7 AS THU, 
datediff(day, -3, @to)/7-datediff(day, -2, @from)/7 AS FRI, 
datediff(day, -2, @to)/7-datediff(day, -1, @from)/7 AS SAT, 
datediff(day, -1, @to)/7-datediff(day, 0, @from)/7 AS SUN 

Une fois que vous avez que vous pouvez faire vos comptes dans votre table

+0

Merci cela aide. Je peux probablement utiliser cela par rapport aux autres données pour compter le nombre de jours travaillés – Timmo

+0

C'est en effet l'idée, je suis sûr que vous allez l'obtenir maintenant – GuidoG

+0

Ça a marché. J'ai utilisé ceci pour obtenir le nombre de jours dans le mois, puis ajouté au compteur si la ressource fonctionne ce jour-là. – Timmo