根据时间步进级别调整时间,解决每月每年时间不固定的问题
This commit is contained in:
parent
40a2e838c4
commit
79a3c25c9d
|
@ -1,5 +1,6 @@
|
|||
using NewLife;
|
||||
using XCode.Configuration;
|
||||
using XCode.Statistics;
|
||||
|
||||
namespace XCode.Shards;
|
||||
|
||||
|
@ -22,6 +23,9 @@ public class TimeShardPolicy : IShardPolicy
|
|||
/// <summary>时间区间步进。遇到时间区间需要扫描多张表时的时间步进,默认1天</summary>
|
||||
public TimeSpan Step { get; set; } = TimeSpan.FromDays(1);
|
||||
|
||||
/// <summary>日期级别。年月日</summary>
|
||||
public StatLevels Level { get; set; }
|
||||
|
||||
private readonly String? _fieldName;
|
||||
#endregion
|
||||
|
||||
|
@ -227,14 +231,29 @@ public class TimeShardPolicy : IShardPolicy
|
|||
{
|
||||
var models = new List<ShardModel>();
|
||||
|
||||
// 猜测时间步进级别
|
||||
var st = Step;
|
||||
var level = Level;
|
||||
if (level <= 0)
|
||||
{
|
||||
if (st.TotalDays >= 360)
|
||||
level = StatLevels.Year;
|
||||
else if (st.TotalDays >= 28 && st.TotalDays <= 31)
|
||||
level = StatLevels.Month;
|
||||
else if (st.TotalDays == 1)
|
||||
level = StatLevels.Day;
|
||||
else if (st.TotalHours == 1)
|
||||
level = StatLevels.Hour;
|
||||
}
|
||||
|
||||
// 根据不仅,把start调整到整点
|
||||
if (Step.TotalDays >= 1)
|
||||
if (st.TotalDays >= 1)
|
||||
start = start.Date;
|
||||
else if (start.Hour >= 1)
|
||||
start = start.Date.AddHours(start.Hour);
|
||||
|
||||
var hash = new HashSet<String>();
|
||||
for (var dt = start; dt < end; dt = dt.Add(Step))
|
||||
for (var dt = start; dt < end;)
|
||||
{
|
||||
var model = Shard(dt);
|
||||
if (model != null)
|
||||
|
@ -246,6 +265,18 @@ public class TimeShardPolicy : IShardPolicy
|
|||
hash.Add(key);
|
||||
}
|
||||
}
|
||||
|
||||
// 根据时间步进级别调整时间,解决每月每年时间不固定的问题
|
||||
if (level == StatLevels.Year)
|
||||
dt = dt.AddYears(1);
|
||||
else if (level == StatLevels.Month)
|
||||
dt = dt.AddMonths(1);
|
||||
else if (level == StatLevels.Day)
|
||||
dt = dt.AddDays(1);
|
||||
else if (level == StatLevels.Hour)
|
||||
dt = dt.AddHours(1);
|
||||
else
|
||||
dt = dt.Add(st);
|
||||
}
|
||||
|
||||
//// 标准时间区间 start <= @fi < end ,但是要考虑到end有一部分落入新的分片,减一秒判断
|
||||
|
|
Loading…
Reference in New Issue