我如何计算重叠假期?

时间:2012-12-06 20:52:43

标签: sql sql-server-2008

我在SQL Server中有一个存储人员角色的时间表表

CREATE TABLE [dbo].[TimeSheetTable](
[pk_TimeSheetID] [bigint] IDENTITY(1,1) NOT NULL,
[fk_PersonelID] [int] NOT NULL,
[StartDate] [datetime] NOT NULL,
[EndDate] [datetime] NOT NULL,
[fk_RoleID] [int] NOT NULL,
[Comments] [nvarchar](2000) NULL,
[dateCreated] [datetime] NOT NULL,
[CreatedBy] [int] NULL,

有时候,从2012年10月28日到2012年11月2日,员工可以休假几个月。通过上面的例子,该员工10月份为4天,11月份为3天。

我的问题是编写一个查询,计算每个假期的天数。如果结束日期超过月份,则不应计算在内。

SELECT TOP 1000 
  sum(DATEDIFF(day,startdate,EndDate))
FROM [db_ASCO_Personel].[dbo].[TimeSheetTable]
where fk_RoleID=51  /* how do I count leave days that over lap between two months*/

第17行在nov中有1天,在dec中有2天(总共3天休假)。我如何计算每个员工单独服用1个月的假期天数?

TimeSheetID StartDate EndDate RoleID注释dateCreated CreatedBy

8月15日 - 6月6日至2012年8月7日51 03:10.6无效 8月16日至2012年8月2日至2012年5月51 03:31.5 NULL 11月17日至29日2012年12月3日至2012年5月51 51:15.5 NULL

2 个答案:

答案 0 :(得分:0)

我只是抓住数据并用c#计算并放入一个新表(或做任何需要处理的值)

但是如果你可以确定休假时间从不超过整整一个月(前开始是jan,结束时间永远不会超过feb)那么你可以做一些if else

SELECT TOP 1000 CASE 
                  WHEN month(startDate) = month(enddate)
                     THEN sum(DATEDIFF(day,startdate,EndDate)) as daymonth1, 0 as daysmonth2
                  ELSE  sum(DATEDIFF(day,startdate,EndDate)) - day(enddate) as daymonth1,day(enddate) as daysmonth2 
                END
FROM [db_ASCO_Personel].[dbo].[TimeSheetTable]
where fk_RoleID=51

检查该语法,因为我没有在此comp上使用ssms来完全测试

编辑:对powaga:除非我愚蠢他做了(只是不清楚)他说他想要返回4和3而不是7 ...他希望得到的天数是每月而不是数量天

答案 1 :(得分:0)

您需要知道月份的开始和结束。像这样:

with const as (
    select cast('2012-09-01' as date) as MonthStart, cast('2012-09-30' as date) as MonthEnd
   )
select sum(DATEDIFF(day,
                    (case when startdate < const.MonthStart then const.MonthStart else startdate end), 
                    (case when enddate > const.MonthEnd then const.MontEnd else ndDate end)
          )
FROM [db_ASCO_Personel].[dbo].[TimeSheetTable] tst cross join
     const
where fk_RoleID=51 and
      startdate <= const.MonthEnd and
      enddate >= const.MonthStart