c#非工作日计算

/*
    2019.7.25,计算扣除非工作日天数
*/ 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data;
using CpmBigDataImportService;


namespace GT
{
    /// <summary>
    /// 非工作日天数计算(单例模式)
    /// </summary>
    public sealed class TsCalc
    {
        private TsCalc(string connStr) {
            string sql = "SELECT rq FROM dbo.GZRL WHERE SFGZR='否' ORDER BY RQ";
            DataTable dtRq = MyCommon.GetDt(sql, connStr);
            if (dtRq.Rows.Count>0)
            {
                fgzrs = dtRq.AsEnumerable().Select(d => d.Field<DateTime>("rq")).ToArray();
            }
        }
        private static volatile TsCalc _tsCalc = null;
        private static object TsCalc_Lock = new object();

        public static TsCalc CreateInstance(string connStr) {
            if (null == _tsCalc)
            {
                lock (TsCalc_Lock)
                {
                    if (null == _tsCalc)
                    {
                        _tsCalc = new TsCalc(connStr);
                    }
                }
            }

            return _tsCalc;
        }


        /// <summary>
        /// 非工作日数组
        /// </summary>
        private DateTime[] fgzrs;

        /// <summary>
        /// 计算
        /// </summary>
        /// <param name="startDate"></param>
        /// <param name="endDate"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public int Calc(DateTime startDate,DateTime endDate,out string msg) {
            int fgzrts = 0;
            List<string> msList = new List<string>();
            int ts = 0;
            while (endDate>=startDate)
            {
                ts++;
                if (fgzrs!= null && fgzrs.Contains(startDate))
                {
                    fgzrts++;
                    msList.Add(startDate.ToString("MM-dd"));
                }

                startDate = startDate.AddDays(1);
            }

            string msg1 = string.Join(",",msList.ToArray());
            if (null == msg1 || msg1.Length == 0)
                msg = null;
            else if (msg1.Length > 50)
                msg = msg1.Substring(0, 47) + "...";
            else
                msg = msg1;
            return ts-fgzrts;
        }
    }
}
        /// <summary>
        /// 更新天数,没有完成日期默认为当天
        /// </summary>
        public void Calc()
        {
            TsCalc tsCalc = TsCalc.CreateInstance(this.ConnectionString);

            string sql = "truncate table CYCLBBTEMP";
            MyCommon.ExecuteSql(sql, ConnectionString);

            BigData bd = new BigData(new BdConfigBase(ConfigPath, "CYCLBBTEMP"));
            bd.InitDataTable();
            DataTable dt = bd.DtData;

            foreach (DataRow drSource in dtSource.Rows)
            {
                string oid = drSource["oid"].ToString();

                DateTime startDate = Convert.ToDateTime(drSource["ycsj"]);
                DateTime endDate = (DBNull.Value == drSource["wcsj"]) ? DateTime.Today : Convert.ToDateTime(drSource["wcsj"]);

                string ms = null;
                int ts = tsCalc.Calc(startDate, endDate, out ms);

                DataRow drNew = dt.NewRow();
                object[] arrItem = new object[] { oid, ts, ms };
                drNew.ItemArray = arrItem;
                dt.Rows.Add(drNew);
            }


            SqlConnectConfig sqc = new SqlConnectConfig();
            sqc.ConnectString = this.ConnectionString;
            sqc.TableName = "CYCLBBTEMP";
            new BigDataToSqlServer(sqc, dt, true);

            sql = "UPDATE dbo.CYCLBB SET ts=b.TS,FGZRMS=b.FGZRMS FROM dbo.CYCLBB a JOIN dbo.CYCLBBTEMP b ON a.OBJECT_ID=b.OBJECT_ID WHERE 1 = 1 ";
            MyCommon.ExecuteSql(sql, this.ConnectionString);
        }

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值