【问题标题】:Get All record group by date and hour if any column have null value如果任何列具有空值,则按日期和小时获取所有记录组
【发布时间】:2018-10-03 18:13:43
【问题描述】:

我有两张桌子。

第一个是open count:

openDate                       OpenCount
2014-08-01 07:00:06.163          1
2014-08-01 09:00:11.873          1 
2014-08-02 03:00:42.623          1
2014-08-02 05:00:48.363          1
2014-08-02 08:01:15.243          1
2014-08-03 07:01:16.507          1

第二个是点击次数

clickDate                       Count
2014-08-01 08:00:06.163           1
2014-08-01 09:00:11.873           1 
2014-08-01 11:00:42.623           1
2014-08-01 15:00:48.363           1
2014-08-03 07:01:15.243           1
2014-08-11 07:01:16.507           1

我想要 2 小时明智、4 小时明智、每周明智和所有时间明智

我使用了以下代码

int groupHours = 2;

int take = 12;
if (type == 1 )
{ groupHours = 2; }
else if (type == 2 )
{ groupHours = 4; }
else if (type == 7 )
{
    groupHours = 24;
    take = 7;
}
else if( type == 0)
{

    take = 12;
}



var queryOpen = objEmailOpen.AsEnumerable()
            .GroupBy(row => new
            {

                Date = row.openDate.Value.Date,
                Hour = (((row.openDate.Value.Hour) / groupHours)) * groupHours
            })
    .Select(grp => new
    {
        Date = grp.Key.Date.AddHours(grp.Key.Hour),
        Hour = grp.Key.Hour,
        OpenCount = grp.Count()
    }).OrderBy(m => m.Date).Take(take).ToList();

var queryClick = objEmailClick.AsEnumerable()
        .GroupBy(row => new
        {
            Date = row.clickedDate.Value.Date,
            Hour = (((row.clickedDate.Value.Hour) / groupHours)) * groupHours
        })
        .Select(grp => new
        {
            Date = grp.Key.Date.AddHours(grp.Key.Hour),
            Hour = grp.Key.Hour,
            ClickCount = grp.Count()
        }).OrderBy(m => m.Date).ToList();


var timeWise = (from m in queryOpen
                join n in queryClick on new { m.Date, m.Hour } equals new { n.Date, n.Hour }
                select new
                {
                    date = Convert.ToDateTime(m.Date),
                    open = m.OpenCount,
                    click = n.ClickCount
                }).ToList().Take(12);

var result = new
{ 
    timeWise = timeWise
};

但这不会给出正确的结果,如果任何时间间隔点击计数为空(0),那么它不会显示该时间间隔记录,这也不适用于所有时间记录。

我希望所有时间记录只在第 12 行,可能需要 1 天的时间间隔或多天或多月。

但结果包含正确的日期时间间隔,例如(如果时间间隔为 2 小时):

date                   openCount      clickcount
2018-8-1 07:00:00        15                 3
2018-8-1 09:00:00        3                  0
2018-8-1 011:00:00       12                 2

【问题讨论】:

  • 您需要使用贝尔实验室多年前开发的算法来按时间段统计电话使用情况。要处理空情况,您必须建立一个时间段表,然后将数据放入时间段中。
  • 你能给我那个算法的链接吗
  • 没有真正的算法。如果你想要几个小时,那么创建一个每小时有 24 行的表。然后使用左外连接将您的表与 24 小时的新表连接起来(以获取空值)。

标签: c# linq entity


【解决方案1】:

创建一个时间间隔列表,如下面的代码。然后使用左外连接将您的表与列表组合以获取空值

            DateTime startDay = DateTime.Now.Date;
            DateTime endDay = startDay.AddDays(1);

            int intervalMinutes = 60;

             DateTime  timeCounter = startDay;

             List<DateTime> intervals = new List<DateTime>();
             while (timeCounter < endDay)
             {
                 intervals.Add(timeCounter);
                 timeCounter = timeCounter.AddMinutes(intervalMinutes);
             }

【讨论】:

  • 你对Enumerable.Range有意见吗? :)
  • 是的,可枚举范围是整数,我需要 TIME。
  • var intervals = Enumerable.Range(0, 24).Select(n =&gt; startDate.AddMinutes(n*60)).ToList();
  • var intervals = Enumerable.Range(0, 24).Select(n =&gt; startDate.AddHours(n)).ToList();
猜你喜欢
  • 1970-01-01
  • 2016-09-21
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 2022-07-03
相关资源
最近更新 更多