栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

计算两个日期之间的总业务工作日

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

计算两个日期之间的总业务工作日

如果您只想排除周末,则可以通过添加以下条件来简单地使用条件计数排除周末:

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 weekdaysfrom departments, dbo.USERINFO INNER JOIN dbo.CHECKINOUT ON      dbo.USERINFO.USERID = dbo.CHECKINOUT.USERIDwhere  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.DateWHERe   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 = @WorkdaysFROM    dbo.Departments AS d        CROSS JOIN dbo.userInfo AS ui        INNER JOIN dbo.CheckInOut AS cio ON cio.UserID = ui.UserIDWHERe   ui.Name = 'Gokul Gopalakrishnan' AND     d.deptname = 'GEN/SUP-TBL' AND     cio.CheckTime >= @StartDateAND     cio.CheckTime <= @EndDate;


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/517385.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号