using Aitex.Core.RT.DBCore; using Sicentury.Core; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.GasFlow { /// /// 气体流量统计,根据输入名称和时间来查询 /// public class GasFlowSqlHelp { /// /// 根据名称和时间段查询结果 /// /// 模块名称 /// /// /// /// public static double Query(string module, string name, DateTime start, DateTime end) { var daySlices = DateRangeHelper.SplitInToHours(new DateRangeHelper(start, end), 12); string tableName = module; string propertyCmd = "," + $"\"{module}.{name}.FeedBack\""; string property = $"{module}.{name}.FeedBack"; return GetData(GetDataSetList(daySlices, tableName, propertyCmd, property), property); } private static List GetDataSetList(IEnumerable daySlices, string tableName, string propertyCmd, string property) { List DataSetList = new List(); foreach (var range in daySlices) { var ts = range.Diff; for (var day = 0; day <= ts.Days; day++) { var tblName = $"{range.Start.AddDays(day):yyyyMMdd}.{tableName}"; var sql = new StringBuilder(); // 检查表名是否存在,否则SQL执行出错。 if (CheckTableExists(tblName)) { sql.Append("select time AS InternalTimeStamp"); // 添加待查询的列 sql.Append(propertyCmd); sql.Append($", \"time\""); sql.Append($" from \"{tblName}\""); if (day < ts.Days) sql.Append(" UNION "); sql.Append( $" where time between {range.Start.Ticks} and {range.End.Ticks} and '{property}' is not NULL order by InternalTimeStamp asc"); try { DataSet dataSet = DB.ExecuteDataset(sql.ToString()); if (dataSet is not null && dataSet.Tables[0].Rows.Count > 0) DataSetList.Add(dataSet); } catch (Exception ex)//查询较早日期时,可能不存在属性会报错 { } } } } return DataSetList; } private static double GetData(List dataSetList, string property) { double values = 0; string rowStr; foreach (DataSet ds in dataSetList) { double timeDifference = 0; for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { rowStr = ds.Tables[0].Rows[i][property].ToString(); if (rowStr is not null && rowStr.Length == 0) continue; double bd = double.Parse(ds.Tables[0].Rows[i][property].ToString()); if (bd > 0) { if (i != ds.Tables[0].Rows.Count - 1)//最后一个数据使用的时间差,是它前一个计算得到的 { var startTime = new DateTime(long.Parse(ds.Tables[0].Rows[i]["time"].ToString())); var endTime = new DateTime(long.Parse(ds.Tables[0].Rows[i + 1]["time"].ToString())); timeDifference = (endTime - startTime).TotalSeconds; } values += bd * timeDifference; } } } return values; } private static bool CheckTableExists(string tableName) { var sql = $"SELECT EXISTS ( SELECT FROM pg_tables WHERE schemaname = 'public' AND tablename = '{tableName}' )"; var table = DB.ExecuteDataset(sql); if (table == null) return false; if (table.Tables[0].Rows.Count <= 0) return false; var value = table.Tables[0].Rows[0]["exists"].ToString(); if (value.ToLower() == "true") return true; return false; } } }