加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

计算在SQL Server中排除周末(周一到周五)的天数

发布时间:2021-01-09 10:04:03 所属栏目:MsSql教程 来源:网络整理
导读:如何计算SQL Server 2008中表(从第1行到结尾)的两个日期之间的工作天数? 我试过这样的东西,但它不起作用 DECLARE @StartDate as DATETIME,@EndDate as DATETIMESelect @StartDate = date2 from testtable ;select @EndDate = date1 from testtable ;SELEC

如何计算SQL Server 2008中表(从第1行到结尾)的两个日期之间的工作天数?

我试过这样的东西,但它不起作用

DECLARE @StartDate as DATETIME,@EndDate as DATETIME

Select @StartDate = date2 from testtable ;
select @EndDate = date1 from testtable ;

SELECT
   (DATEDIFF(dd,@StartDate,@EndDate) + 1)
  -(DATEDIFF(wk,@EndDate) * 2)
  -(CASE WHEN DATENAME(dw,@StartDate) = 'Sunday' THEN 1 ELSE 0 END)
  -(CASE WHEN DATENAME(dw,@EndDate) = 'Saturday' THEN 1 ELSE 0 END)

解决方法

我会一直推荐 Calendar table,那么你可以简单地使用:
SELECT  COUNT(*)
FROM    dbo.CalendarTable
WHERE   IsWorkingDay = 1
AND     [Date] > @StartDate
AND     [Date] <= @EndDate;

由于SQL不了解国定假日,例如两个日期之间的工作日数并不总是代表工作日数.这就是大多数数据库必须使用日历表的原因.它们不占用大量内存并简化了大量查询.

但如果这不是一个选项,那么你可以在运行中相对容易地生成一个日期表并使用它

SET DATEFIRST 1;
DECLARE @StartDate DATETIME = '20131103',@EndDate DATETIME = '20131104';

-- GENERATE A LIST OF ALL DATES BETWEEN THE START DATE AND THE END DATE
WITH AllDates AS
(   SELECT  TOP (DATEDIFF(DAY,@EndDate))
            D = DATEADD(DAY,ROW_NUMBER() OVER(ORDER BY a.Object_ID),@StartDate)
    FROM    sys.all_objects a
            CROSS JOIN sys.all_objects b
)
SELECT  WeekDays = COUNT(*)
FROM    AllDates
WHERE   DATEPART(WEEKDAY,D) NOT IN (6,7);

编辑

如果您需要计算两个日期列之间的差异,您仍然可以使用您的日历表:

SELECT  t.ID,t.Date1,t.Date2,WorkingDays = COUNT(c.DateKey)
FROM    TestTable t
        LEFT JOIN dbo.Calendar c
            ON c.DateKey >= t.Date1
            AND c.DateKey < t.Date2
            AND c.IsWorkingDay = 1
GROUP BY t.ID,t.Date2;

Example on SQL-Fiddle

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读