我在表格中存储了no.of days
,start date
和end 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
答案 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