c# - C#如何获取员工的总休假数

标签 c# asp.net sql-server

我从我的 SQL 查询中返回了一些记录集,其中我获得了员工姓名以及他当月休假的开始和结束日期。我的问题是我得到了同一员工的两条记录,但休假日期不同。现在我想要该员工休假时的所有日期(应该结合他的休假数据)。

我的 SQL 查询是:

SELECT distinct emp.emp_name, 
       NULL as start_date,
       NULL as end_date 
FROM employee_details emp 
WHERE emp.group_name = 'A' and 
      Emp_Id not in (SELECT distinct emp.Emp_Id 
                     FROM employee_details emp, offshore_leave_calendar olc 
                     WHERE emp.emp_id = olc.emp_id AND 
                           emp.group_name = 'A' and 
                           datepart(mm,olc.start_date) = datepart(mm, getdate()))
union 

SELECT distinct emp.emp_name,
       olc.Start_Date,
       olc.End_Date 
FROM employee_details emp, offshore_leave_calendar olc     
WHERE emp.emp_id = olc.emp_id AND 
      emp.group_name = 'A' and 
      datepart(mm, olc.start_date) = datepart(mm,getdate())

我上面查询的输出是:

Emp_Name            start_date               end_date
John         
Sophia       
Olivia
Davis          3/20/2017 12:00:00 AM    3/24/2017 12:00:00 AM
Clark          3/21/2017 12:00:00 AM    3/24/2017 12:00:00 AM
Paul         
Thomas         3/21/2016 12:00:00 AM    3/29/2016 12:00:00 AM
Thomas         3/6/2017 12:00:00 AM     3/10/2017 12:00:00 AM

在上面的输出中,Thomas 在本月休了两次假。所以我想要 Thomas 在 C# 列表中休假时的所有日期。输出日期应该是:

3/06/2016
3/07/2016
3/08/2016
3/09/2016
3/10/2016
3/21/2016
3/22/2016
3/23/2016
3/24/2016
3/25/2016
3/26/2016
3/27/2016
3/28/2016
3/29/2016

谁能帮我解决这个问题?

我有一个列表:

 List<LeaveData> leaveList = new List<LeaveData>();

其中 LeaveData 类具有以下三个定义:

public string Emp_Name { get; set; }
public DateTime? start_date { get; set; }
public DateTime? end_date { get; set; }

我想在每个月的每个日期分配一名员工,而休假的员工不应分配。所以我循环了一个月的所有日期并编写了这段代码来查找员工休假的日期:

for (int i = 0; i < dates.Length; i++)
{
    for (DateTime? date = leaveList[index].start_date; date <= leaveList[index].end_date; date = date.Value.AddDays(1))
            {
                allDates.Add(date);
            }
}

其中索引是从 0 到 7 的计数(在本例中)。索引将指向我从 SQL 查询中获得的任何员工。

最佳答案

假设您有一个用 C# 编写的员工列表

List<Employee> employees = ... 

IEnumerable<DateTime> leaveDates = 
    employees.Where(emp=>emp.Emp_Name == "Thomas")
             .SelectMany(emp =>
                Enumerable.Range(0, emp.EndDate.Subtract(emp.StartDate).Days + 1)
                          .Select(d => e.StartDate.AddDays(d)));

解释

这将获取两个日期之间的日期范围:

Enumerable.Range(0, e.EndDate.Subtract(e.StartDate).Days + 1)
                          .Select(d => e.StartDate.AddDays(d)));

剩下的只是WhereSelectMany 的简单 linq 是将结果投影并展平到相同的序列中

编辑
作为您的评论:如果您在 leaveList[index] 中有数据,那么您只需将“Thomas”替换为 leaveList[index].Emp_Name。而且我还添加了空日期检查:

IEnumerable<DateTime> leaveDates = 
        employees.Where(emp=>emp.Emp_Name == leaveList[index].Emp_Name && 
                             emp.StartDate.HasValue && emp.EndDate.HasValue)
                 .SelectMany(emp =>
                     Enumerable.Range(0,
                                emp.EndDate.Value.Subtract(emp.StartDate.Value).Days + 1)
                              .Select(d => e.StartDate.Value.AddDays(d)));

关于c# - C#如何获取员工的总休假数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42620609/

相关文章:

php - 离开绝对的日子

c# - 只读和不带setter的prop有什么区别?

sql - 我需要在 sql 中做一个 View ,返回每个公司的最新发票日期

r - 尝试将表写入非默认模式时 SQL 函数不起作用

asp.net - 相当于 ASP.NET 中的 ASP.NET MVC TempData

通过服务进行 ASP.NET 成员身份验证

C# ASP.NET 标识

c# - 主键的下一个值

c# - Linq2Sql - 使用本地集合作为子查询的一部分 - "queries with local collections are not supported"

c# - 将 MIDI 字节数组转换为 MP3 字节数组