select count(distinct(dateadd(d, 0, datediff(d, 0,checktime)))) as workingdays
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'
从上面的代码中我可以找到两个日期之间员工的总工作日。
workingdays
20
但现在我想要其他列名称的总工作日。我想计算两个日期之间的总工作日。
workingdays businessdays
20 21
我该怎么做?
答案 0 :(得分:4)
如果您只想排除周末,那么您只需添加以下内容即可使用条件计数排除这些:
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'
HOWEVER 我真的建议您在数据库中添加calendar table。它使一切变得如此简单,您的查询将成为:
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 :(得分:0)
以下查询计算@FromDate和@ToDate变量之间的星期五计数
((DATEDIFF(DAY,@FromDate,@ToDate)-(6-DATEPART(dw,@FromDate)))/7)*2
以下查询计算工作日计数和工作日计数至今:
DECLARE @FromDate DATE = '2014-05-01',
@ToDate DATE = '2014-05-30'
SELECT COUNT(DISTINCT CAST(checktime AS Date)) as workingdays,
DATEDIFF(DAY,@FromDate,@ToDate) -
((DATEDIFF(DAY,@FromDate,@ToDate)-(6-DATEPART(dw,@FromDate)))/7)*2 AS BusinessDay
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>= @FromDate and checktime<=@ToDate