Sql 我如何计算重叠的假期?

Sql 我如何计算重叠的假期?,sql,sql-server-2008,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

我在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行11月有1天假期,12月有2天假期,总共3天。我如何计算每个员工单独一个月的休假天数

TimeSheetID StartDate EndDate RoleID注释DateCreatedBy 2012年8月6日15日2012年8月7日51 03:10.6无效 2012年8月1日16日2012年8月2日51 03:31.5无效
2012年11月29日2012年12月3日51:15.5空

我只需要抓取数据,用c计算,然后放入一个新表,或者用这些值做任何需要做的事情

但如果你能确定假期不会超过一个月,开始时间是1月,结束时间是2月,那么你可以做一些别的事情

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
检查语法,因为我没有此组件上的SSM进行全面测试


编辑:对波瓦加:除非我很蠢,否则他只是没有明确表示他想返回4和3而不是7。。。他希望得到的天数是每月,而不是天数。你需要知道月的开始和结束。大概是这样的:

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

你的问题对每个月都不重要?我不明白这个问题。DATEDIFF将两个月的天数计算为两个月总天数差的一部分。如果他们在10月花了4天,11月2日花了2天,11月2日不可能是3天,总共是6天,DATEDIFF将返回6天。通常最好的解释方法是显示预期的结果集,例如数据。我删除了c标记,因为它显然与您的问题无关。您的帖子中没有一个词解释它的存在,问题似乎完全与SQL有关。如果您认为它对您的问题很重要,请随意将其放回原处。