根据开始、结束时间获取工作日天数及根据开始时间、工作日天数获取截止日期(数据库存储节假日信息)

整理下根据开始、结束时间获取工作日天数及根据开始时间、工作日天数获取截止日期两个方法。
包含节假日补班及调休信息,节假日表可同步接口或自行编辑。

        /// <summary>
        /// 根据时间获取有多少工作日
        /// </summary>
        /// <param name="StartTime">开始时间</param>
        /// <param name="EndTime">结束时间</param>
        /// <returns></returns>
        public string GetWorkNum(string StartTime, string EndTime)
        {

            DateTime start = Convert.ToDateTime(StartTime);
            DateTime end = Convert.ToDateTime(EndTime);

            int num = 0; //用于记录工作日天数
            TimeSpan span = end - start;
            //int totleDay=span.Days;
            //DateTime spanNu = DateTime.Now.Subtract(span);
            int AllDays = Convert.ToInt32(span.TotalDays) + 1;//差距的所有天数
            int totleWeek = AllDays / 7;//差别多少周
            int yuDay = AllDays % 7; //除了整个星期的天数
            int lastDay = 0;
            if (yuDay == 0) //正好整个周
            {
                lastDay = AllDays - (totleWeek * 2);
            }
            else
            {
                int weekDay = 0;
                int endWeekDay = 0; //多余的天数有几天是周六或者周日
                switch (start.DayOfWeek)
                {
                    case DayOfWeek.Monday:
                        weekDay = 1;
                        break;
                    case DayOfWeek.Tuesday:
                        weekDay = 2;
                        break;
                    case DayOfWeek.Wednesday:
                        weekDay = 3;
                        break;
                    case DayOfWeek.Thursday:
                        weekDay = 4;
                        break;
                    case DayOfWeek.Friday:
                        weekDay = 5;
                        break;
                    case DayOfWeek.Saturday:
                        weekDay = 6;
                        break;
                    case DayOfWeek.Sunday:
                        weekDay = 7;
                        break;
                }
                if ((weekDay == 6 && yuDay >= 2) || (weekDay == 7 && yuDay >= 1) || (weekDay == 5 && yuDay >= 3) || (weekDay == 4 && yuDay >= 4) || (weekDay == 3 && yuDay >= 5) || (weekDay == 2 && yuDay >= 6) || (weekDay == 1 && yuDay >= 7))
                {
                    endWeekDay = 2;
                }
                if ((weekDay == 6 && yuDay < 1) || (weekDay == 7 && yuDay < 5) || (weekDay == 5 && yuDay < 2) || (weekDay == 4 && yuDay < 3) || (weekDay == 3 && yuDay < 4) || (weekDay == 2 && yuDay < 5) || (weekDay == 1 && yuDay < 6))
                {
                    endWeekDay = 1;
                }
                lastDay = AllDays - (totleWeek * 2) - endWeekDay;
            }
            num = lastDay;

            //查询数据库获取补班及放假信息
            string con = ConfigPara.EFDBConnection;
            System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex("\"[^\"]*\"");
            con = regex.Match(con).Value.Replace("\"", "");
            string where = "where  [Date] >='" + StartTime + "'  and [Date] < '" + EndTime + "' ";

            DataTable data = ExecuteDataTable(@"SELECT  [ID],[Year] ,[Date] ,[wage],[DayName] ,[sType],[status] ,[Remark] FROM [AppsDB_new].[dbo].[Static_WorkingDay] "
                        + where + @"  ", con);
            //循环获取数据库假期数据,根据sType字段(true,false)判断。 如果遇周末补班加+天,遇工作日休息-1天
            for (int i = 0; i < data.Rows.Count; i++)
            {
                //判断该日期是否为补班 (False) 
                if (data.Rows[i]["sType"].ToString() == "false")
                {
                    //判断如果日期是周六或者周末
                    if (Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Sunday || Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Saturday)
                    {
                        num++;
                    }
                }
                else
                {
                    if (Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Monday || Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Tuesday
                        || Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Wednesday || Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Thursday
                        || Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Friday)
                    {
                        num--;
                    }
                }

            }
            return num.ToString();
        }

        /// <summary>
        /// 根据开始时间、工作日  获取截止日期。
        /// </summary>
        /// <param name="StartTime">开始时间</param>
        /// <param name="num">工作日天数</param>
        /// <returns></returns>
        public string GetDate(string StartTime, int WorkNum)
        {


            DateTime start = Convert.ToDateTime(StartTime);
            DateTime endTime = Convert.ToDateTime(StartTime).AddDays(+WorkNum); //结束时间暂且设置为开始时间+工作日天数
            int dayNum = WorkNum;//声明天数
            for (int i = 0; i < dayNum; i++)
            {
                //开始日期递增,判断是否为周末
                if (Convert.ToDateTime(start.AddDays(+i)).DayOfWeek == DayOfWeek.Sunday || Convert.ToDateTime(start.AddDays(+i)).DayOfWeek == DayOfWeek.Saturday)
                {
                    //如果是,自然日天数+1
                    dayNum++;
                }
            }
            //循环结束后,得到除掉周末的开始日期至截止日期天数dayNum。
            DateTime EndTime = Convert.ToDateTime(StartTime).AddDays(+dayNum);


            //查询数据库获取补班及放假信息
            string con = ConfigPara.EFDBConnection;
            System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex("\"[^\"]*\"");
            con = regex.Match(con).Value.Replace("\"", "");
            string where = "where  [Date] >='" + StartTime + "'  and [Date] < '" + EndTime + "' ";
            //获取时间段内调休、补班信息
            DataTable data = ExecuteDataTable(@"SELECT  [ID],[Year] ,[Date] ,[wage],[DayName] ,[sType],[status] ,[Remark] FROM [AppsDB_new].[dbo].[Static_WorkingDay] "
                        + where + @"  ", con);
            int tx = 0;
            int bb = 0;
            //循环获取数据库假期数据,根据sType字段(true,false)判断。 如果遇周末补班加+天,遇工作日休息-1天
            //循环过程中如有周末补班或工作日放假,则对天数进行调整,调整过程中查询数据库获取调整时的日期,判断是否为补班或放假,再次进行天数调整。
            //数据量不大,写法为直接获取数据库数据,如遇性能问题,可将本方法内读取数据库的方式调整为集合。
            for (int i = 0; i < data.Rows.Count; i++)
            {
                //判断该日期是否为补班 (False) 
                if (data.Rows[i]["sType"].ToString() == "false")
                {
                    //判断如果日期是周六或者周末
                    if (Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Sunday || Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Saturday)
                    {
                        bb++;//周末上班
                    }
                }
                else
                {
                    if (Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Monday || Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Tuesday
                        || Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Wednesday || Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Thursday
                        || Convert.ToDateTime(data.Rows[i]["Date"]).DayOfWeek == DayOfWeek.Friday)
                    {
                        tx++;//工作日休息
                    }
                }
            }
            if (tx > 0) //如果工作日休息天数>0
            {
                for (int i = 1; i <= tx; i++)
                {
                    //自然日递增,判断如果为周末,再次递增
                    if (EndTime.AddDays(+i).DayOfWeek == DayOfWeek.Sunday || EndTime.AddDays(+i).DayOfWeek == DayOfWeek.Saturday)
                    {
                        data = ExecuteDataTable(@"SELECT  [ID],[Year] ,[Date] ,[wage],[DayName] ,[sType],[status] ,[Remark] FROM [AppsDB_new].[dbo].[Static_WorkingDay] "
                        + @" where Date ='" + EndTime.AddDays(+i) + "' and sType='false' ", con);
                        //如果这天为补班,则延后天数不增加。否则延后天数增加+1
                        if (data.Rows.Count > 0)
                        {

                        }
                        else
                        {
                            tx++;
                        }
                    }
                    else
                    {
                        //如果为工作日
                        data = ExecuteDataTable(@"SELECT  [ID],[Year] ,[Date] ,[wage],[DayName] ,[sType],[status] ,[Remark] FROM [AppsDB_new].[dbo].[Static_WorkingDay] "
                       + @" where Date ='" + EndTime.AddDays(+i) + "' and sType='true' ", con);
                        //判断当天是否放假,如果放假,延后天数+1
                        if (data.Rows.Count > 0)
                        {
                            tx++;
                        }
                    }
                }
                EndTime = EndTime.AddDays(+tx);
            }
            if (bb > 0)
            {
                for (int i = 1; i <= bb; i++)
                {
                    //判断如果为周末,再次递减
                    if (EndTime.AddDays(-i).DayOfWeek == DayOfWeek.Sunday || EndTime.AddDays(-i).DayOfWeek == DayOfWeek.Saturday)
                    {
                        data = ExecuteDataTable(@"SELECT  [ID],[Year] ,[Date] ,[wage],[DayName] ,[sType],[status] ,[Remark] FROM [AppsDB_new].[dbo].[Static_WorkingDay] "
                       + @" where Date ='" + EndTime.AddDays(-i) + "' and sType='false' ", con);
                        //bb为补班天数 用于总天数减掉,递减过程中,如果遇到周末补班,则不再多减总天数。
                        if (data.Rows.Count > 0)
                        {
                        }
                        else
                        {
                            bb++;
                        }
                    }
                }
                EndTime = EndTime.AddDays(-bb);
            }
            return EndTime.ToString();
        }

数据库表结构如下:
year:年份
Date:日期
wage:星期
sType:值为true or false,放假为true,补班为false
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值