c#非工作日计算

it2023-12-04  100

/* 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); }

 

 

最新回复(0)