【问题标题】:matrix report for leaves叶子矩阵报告
【发布时间】:2023-10-23 16:45:01
【问题描述】:

我将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

【问题讨论】:

  • 请编辑您的问题以包括相关表格 DDL、一些用于示例数据的 DML 以及所需的结果。
  • 您是否测试过以下解决方案?

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


【解决方案1】:

尝试以下解决方案:

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

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

【讨论】: