Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

दो तिथियों के बीच कुल व्यावसायिक कार्य दिवसों की गणना करें

यदि आप केवल सप्ताहांतों को बाहर करना चाहते हैं तो आप केवल सशर्त गणना का उपयोग करके इन्हें जोड़ कर बाहर कर सकते हैं:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में परिणाम सेट में लौटाए गए कॉलम के डेटा प्रकार का पता लगाएं

  2. SQL सर्वर 2008 R2 बनाम SQL सर्वर एक्सप्रेस के लिए कनेक्शन स्ट्रिंग

  3. अभिव्यक्ति के साथ स्ट्रिंग को दशमलव में बदलें

  4. समूहीकरण के साथ कई पंक्तियों को एक पाठ स्ट्रिंग में संयोजित करें

  5. SQL सर्वर चर:लूप बनाम डुप्लिकेट?