计算在SQL Server中排除周末(周一到周五)的天数
发布时间:2021-01-10 10:18:20 所属栏目:编程 来源:网络整理
导读:怎样计较SQL Server 2008中表(从第1行到末了)的两个日期之间的事变天数? 我试过这样的对象,但它不起浸染 DECLARE @StartDate as DATETIME,@EndDate as DATETIMESelect @StartDate = date2 from testtable ;select @EndDate = date1 from testtable ;SELECT (
怎样计较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 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |