我在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个月的假期天数?
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
答案 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