यदि आप केवल सप्ताहांतों को बाहर करना चाहते हैं तो आप केवल सशर्त गणना का उपयोग करके इन्हें जोड़ कर बाहर कर सकते हैं:
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;