sql >> データベース >  >> RDS >> Sqlserver

2 つの日付間の合計営業日数を計算する

    週末のみを除外したい場合は、以下を追加することにより、条件付きカウントを使用して単純にこれらを除外できます:

    count(distinct case when datepart(weekday, getdate()) <= 5 then date end)
    

    したがって、クエリは次のようになります。

    set datefirst 1;
    
    select  count(distinct(dateadd(d, 0, datediff(d, 0,checktime)))) as workingdays,
            count(distinct case when datepart(weekday, getdate()) <= 5 
                                then dateadd(d, 0, datediff(d, 0,checktime)) 
                            end) as weekdays
    from departments,
     dbo.USERINFO INNER JOIN dbo.CHECKINOUT ON 
         dbo.USERINFO.USERID = dbo.CHECKINOUT.USERID
    where  userinfo.name='Gokul Gopalakrishnan' and deptname='GEN/SUP-TBL' 
    and checktime>='2014-05-01' and checktime<='2014-05-30'
    

    ただし カレンダー テーブル あなたのデータベースに。すべてがとても簡単になり、クエリは次のようになります:

    SELECT  DaysWorked = COUNT(cio.Date),
            WeekDaysWorked = COUNT(CASE WHEN c.IsWeekDay = 1 THEN cio.Date END),
            WorkingDaysWorked = COUNT(CASE WHEN c.IsWorkingDay = 1 THEN cio.Date END),
            TotalDays = COUNT(*),
            TotalWeekDays = COUNT(CASE WHEN c.IsWeekDay = 1 THEN 1 END),
            TotalWorkingDays = COUNT(CASE WHEN c.IsWorkingDay = 1 THEN 1 END)
    FROM    dbo.Calender AS c
            LEFT JOIN
            (   SELECT  DISTINCT
                        Date = CAST(CheckTime AS DATE)
                FROM    dbo.Departments AS d
                        CROSS JOIN dbo.userInfo AS ui
                        INNER JOIN dbo.CheckInOut AS cio
                            ON cio.UserID = ui.UserID
                WHERE   ui.Name = 'Gokul Gopalakrishnan' 
                AND     d.deptname = 'GEN/SUP-TBL' 
            ) AS cio
                ON c.Date = cio.Date
    WHERE   d.Date >= '2014-05-01'
    AND     d.Date <= '2014-05-30';
    

    このようにして、祝日や週末などを定義できます。他のどのソリューションよりもはるかに柔軟です。

    編集

    元の基準を誤解していたと思います。これは、カレンダー テーブルがなくても機能するはずです:

    SET DATEFIRST 1;
    
    DECLARE @StartDate DATE = '2014-05-01', 
            @EndDate DATE = '2014-05-30';
    
    DECLARE @Workdays INT = 
        (DATEDIFF(DAY, @StartDate, @EndDate) + 1)
        -(DATEDIFF(WEEK, @StartDate, @EndDate) * 2)
        -(CASE WHEN DATEPART(WEEKDAY, @StartDate) = 7 THEN 1 ELSE 0 END)
        -(CASE WHEN DATEPART(WEEKDAY, @EndDate) = 6 THEN 1 ELSE 0 END);
    
    
    SELECT  WorkingDays = COUNT(DISTINCT CAST(CheckTime AS DATE)),
            BusinessDays = @Workdays
    FROM    dbo.Departments AS d
            CROSS JOIN dbo.userInfo AS ui
            INNER JOIN dbo.CheckInOut AS cio
                ON cio.UserID = ui.UserID
    WHERE   ui.Name = 'Gokul Gopalakrishnan' 
    AND     d.deptname = 'GEN/SUP-TBL' 
    AND     cio.CheckTime >= @StartDate
    AND     cio.CheckTime <= @EndDate;
    


    1. OracleSQLDeveloperのDB2データベース

    2. MySQLデータベースが破損しています...どうすればよいですか?

    3. MariaDBの名前付きコマンド

    4. PostgreSQLは再帰CTEから関数にデータを渡します