Группировка периодов дат (по количеству дней), но исключая выходные? - PullRequest
0 голосов
/ 26 января 2010

У меня есть таблица с датами начала и окончания. Моя цель - создать таблицу, сгруппировавшую эти даты по количеству дней периода. Я думал, что у меня есть решение с простым оператором SQL (MS SQL Server 2005), но я хочу исключить выходные.

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

Это дает набор записей:

Days Count
1    4
2    2
4    1
7    2

Возможно ли исключить выходные дни в операторе SQL, а если нет, то возможно это сделать с помощью ASP и массива?

Ответы [ 3 ]

1 голос
/ 26 января 2010

Ну тогда, используя Sql Server 2005, вы можете попробовать что-то вроде

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)

выход

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

РЕДАКТИРОВАТЬ: краткое изложение

Вам необходимо определить количество дней между (включая) 2 датами, которые не являются выходными.

Таким образом, используя CTE , я создаю временный результирующий набор дат, включающий минимальную и максимальную даты и их название дня недели (например, понедельник, вторник ... воскресенье).

Затем для каждой из ваших пар дат я подсчитываю количество записей, которые не соответствуют субботе и воскресенью.

0 голосов
/ 27 января 2010

Посмотрите на @@ DATEFIRST,

и посмотрите это;

ВЫБРАТЬ DATEPART (DW, GETDATE ()).

Вы должны быть в состоянии выполнить запрос, ГДЕ 'DW' не равен номерам выходных.

0 голосов
/ 26 января 2010

Вот функция ASP, которая считает дни недели между двумя датами.

<%
    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
%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...