叶子的矩阵报告

时间:2016-06-06 08:37:49

标签: c# sql-server c#-4.0

我在表格中存储了no.of daysstart dateend date来存储员工的任意一张。

我想创建报告,用户从日历中选择开始日期和结束日期,报告根据所选日期显示数据。但我的问题是,如果用户选择一个在开始日期和结束日期之间的日期,我想要该特定员工准确的天数。

代表。以下数据保存在数据库中

  

不是第3天

     

开始日期02/06/2016

     

结束日期04/06/2016

用户从日历中选择了开始日期03/06/2016和结束日期04/06/2016。 预期的结果是:没有。天2

请建议使用SQL查询或C#代码

表格结构

leaveId empid   leavetypeId     noofdays    startdate     enddate   
1            76         1             3         2016-06-02    2016-06-04    

查询我按如下方式解雇

select noofdays 
from table 
where startdate='2016-06-03' and enddate='2016-06-04'

和预期结果

noofdays = 2

1 个答案:

答案 0 :(得分:0)

尝试以下解决方案:

DECLARE 
    @pStartDate DATE = {d '2016-06-01'}, -- p = parameter
    @pEndDate   DATE = {d '2016-06-12'}

SELECT SUM(DATEDIFF(DAY, x.CommonRangeStartDate, x.CommonRangeEndDate) + 1) AS NumOfCommonDays
FROM    (VALUES 
    (1, {d '2016-06-02'}, {d '2016-06-04'}),
    (2, {d '2016-06-02'}, {d '2016-06-02'}),
    (3, {d '2016-06-04'}, {d '2016-06-10'}),
    (4, {d '2016-06-12'}, {d '2016-06-15'}), 
    (5, {d '2016-06-14'}, {d '2016-06-17'}),
    (6, {d '2016-05-01'}, {d '2016-06-18'})
) s(LeaveID, StartDate, EndDate) -- I assume SD & ED's data type is DATE
CROSS APPLY (
    SELECT 
        CASE WHEN s.StartDate >= @pStartDate THEN s.StartDate ELSE @pStartDate END AS CommonRangeStartDate, -- MAX
        CASE WHEN s.EndDate <= @pEndDate THEN s.EndDate ELSE @pEndDate END AS CommonRangeEndDate -- MIN
) x
WHERE s.StartDate <= @pEndDate
AND @pStartDate <= s.EndDate

注意#1:假设:StartDate&lt; = EndDate,@ pStartDate&lt; = @EndDate

注意#2:如果您想查看详细信息,请使用SELECT *代替SELECT SUM