0

我在 SQL Server 中有一个 Timesheet 表,用于存储人员角色

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 天假期)。我如何计算每个员工仅 1 个月的休假天数?

TimeSheetID StartDate EndDate RoleID Comments dateCreated CreatedBy

2012 年 8 月 6 日 15 日 2012 年 8 月 7 日 51 03:10.6 NULL 2012 年 8 月 1 日 16 日 2012 年 8 月 2 日 51 03:31.5 NULL 2012 年 11 月 29 日 17 日 2012 年 12 月 3 日 51 51:15.5 NULL

4

2 回答 2

0

我只是抓取数据并用 c# 计算并放入一个新表中(或对这些值做任何需要做的事情)

但是,如果您可以确定假期时间永远不会超过一个月(例如开始时间是一月,结束时间永远不会晚于二月),那么您可以做一些其他事情

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 ......他希望得到的天数是每月而不是天数

于 2012-12-06T21:10:15.123 回答
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
于 2012-12-06T21:10:50.857 回答