2010-01-26 8 views
0

J'ai un tableau avec les dates de début et de fin. Mon but est d'avoir une table qui a regroupé ces dates en combien de jours la période s'étend. Je pensais avoir la solution avec une simple instruction SQL (MS SQL Server 2005) mais je veux exclure les weekends.Regrouper les périodes de date (par nombre de jours) mais exclure les fins de semaine?

SELECT DATEDIFF(D, StartDate, EndDate)+1 AS Days, 
COUNT(ID) as Count 
FROM myDateTable 
GROUP BY DATEDIFF(D, StartDate, EndDate) 

Cela donne un jeu d'enregistrements:

Days Count 
1 4 
2 2 
4 1 
7 2 

Est-ce possible d'exclure le week-end dans l'instruction SQL et si ce ne peut-il être fait en utilisant ASP et un tableau peut-être?

+0

Pouvez-vous ajouter des tables à votre source de données? Je peux voir un moyen de le faire avec des tables de recherche spéciales à l'intérieur de SQL Server. En outre, peut voir un moyen de le faire à l'intérieur de l'ASP en utilisant une boucle. De quelle façon préférez-vous? –

+0

Oui, je peux ajouter des tables à ma source de données mais je pense que je préférerais une solution ASP à l'ajout de tables. – tonyyeb

+0

Quelle version de Sql Server utilisez-vous? –

Répondre

1

Eh bien, en utilisant Sql Server 2005, vous pouvez essayer quelque chose comme

DECLARE @Table TABLE(
     ID INT, 
     StartDate DATETIME, 
     EndDate DATETIME 
) 

INSERT INTO @Table (ID,StartDate,EndDate) SELECT 1, '25 Jan 2009', '31 Jan 2009' 
INSERT INTO @Table (ID,StartDate,EndDate) SELECT 2, '01 Jan 2009', '07 Jan 2009' 
INSERT INTO @Table (ID,StartDate,EndDate) SELECT 3, '01 Jan 2009', '14 Jan 2009' 

DECLARE @MinDate DATETIME, 
     @MaxDate DATETIME 

SELECT @MinDate = MIN(StartDate) , 
     @MaxDate = MAX(EndDate) 
FROM @Table 
--Create a temp result set between the Min and Max dates, with all dates, and their weekday names 
;WITH DayValues AS(
     SELECT @MinDate DateVal, 
       DATENAME(dw, @MinDate) DateValName 
     UNION ALL 
     SELECT DateVal + 1, 
       DATENAME(dw, DateVal + 1) DateValName 
     FROM DayValues 
     WHERE DateVal + 1 <= @MaxDate 
), 
--select the count of days for each StartDate and EndDate pair, excluding Saturdays and Sundays 
DateCounts AS(
     SELECT ID, 
       (
        SELECT COUNT(1) 
        FROM DayValues 
        WHERE DateVal BETWEEN StartDate AND EndDate 
        AND  DateValName NOT IN ('Saturday', 'Sunday') 
       ) DateCount 
     FROM @Table 
) 
--Now group and count 
SELECT DateCount, 
     COUNT(ID) TotalCount 
FROM DateCounts 
GROUP BY DateCount 
OPTION (MAXRECURSION 0) 

Sortie

DateCount TotalCount 
----------- ----------- 
5   2 
10   1 

EDIT: Brève explenation

Vous devez déterminer le nombre de jours entre (et incluant) 2 dates, qui ne sont pas des week-ends. Par conséquent, en utilisant un CTE, je crée un ensemble de résultats temporaires entre les dates Min et Max et leur nom de jour de la semaine (par exemple lundi, mardi ... dimanche). Puis, pour chacune de vos paires de date, je compte le nombre d'entrées qui ne correspondent pas au samedi et au dimanche.

+0

Salut Astander, une chance que vous pourriez expliquer ce qui se passe ici? Je ne suis pas un gourou du serveur SQL par aucun effort d'imagination! – tonyyeb

+0

J'ai donné une explication breif. Faites-moi savoir si vous avez besoin de plus d'aide. –

0

Voici une fonction ASP qui compte les jours de la semaine entre deux dates.

<% 
    Dim StartDate, EndDate 

    StartDate = CDate("1/1/2010") 
    EndDate = CDate("2/1/2010") 

    Response.Write(WeekDayCount(StartDate, EndDate)) 


    Function WeekDayCount(StartDate, EndDate) 
     dim tempDate, dayCount 

     tempDate = StartDate 
     dayCount = 0 

     'Step forward one day, counting non-week days 
     While tempDate <> EndDate 
      'The 1 and 7 might need to be tweaked depending on the locale of your 
      'server. 1 = Sunday, 7 = Saturday 
      If DatePart("w", tempDate) <> 1 And DatePart("w", tempDate) <> 7 Then 
       dayCount = dayCount + 1 
      End If 

      tempDate = DateAdd("d", 1, tempDate) 
     Wend 

      WeekDayCount = dayCount 
    End Function 
%> 
0

Jetez un oeil à @@ DATEFIRST,

et regarder un présent;

SELECT DATEPART (DW, GETDATE()).

Vous devriez être en mesure d'exécuter une requête O WH le «DW» n'est pas égal aux numéros de week-end.

Questions connexes