【问题标题】:summing values of a column based on id [closed]基于 id 对列的值求和 [关闭]
【发布时间】:2016-05-25 06:12:47
【问题描述】:

我有一个表格可以记录用户的在线时间。例如如果用户在 10:00 登录并在 10:30 离开,这将是一条包含 userId、登录时间、注销时间和日期的记录。用户在 11:05 再次出现并在 11:50 离开。这是另一个记录。我想要每个用户每天的时间总和。使用实体框架工作,c#, 这是数据结构

id     userId     loginTime     logoutTime     日期
1       1           10:00             10:20           2015 年 11 月 6 日
1       1          10:30             10:50           2015 年 11 月 6 日
1       1           09:00             10:00           2015 年 12 月 6 日
1       1           10:15              11:00           2015 年 12 月 6 日
她是输出

对于 11-06-2015,应该是 40 分钟
12-06-2015 应该是 105

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 请指定您的表结构和预期输出。
  • 与您的问题没有直接关系,但如果您拆分日期和时间可能会在跨越时区时给您带来麻烦,例如如果用户在 DST 更改之前登录。我建议您将 loginTime 和 logoutTime 保存为两个 datetimeoffset 字段。
  • 欢迎来到stackoverflow。请阅读How to Ask

标签: c# sql-server entity-framework


【解决方案1】:

首先,我创建了一个单表数据库来模仿数据结构:

static void CreateAndSeedDatabase()
{
    Context context = new Context();
    TimeTracker entry1 = new TimeTracker() { UserId = 1, LoginTime = new DateTime(2000, 1, 1, 0, 0, 0), LogoutTime = new DateTime(2000, 1, 1, 1, 0, 0) };
    TimeTracker entry2 = new TimeTracker() { UserId = 1, LoginTime = new DateTime(2000, 1, 1, 1, 0, 0), LogoutTime = new DateTime(2000, 1, 1, 2, 0, 0) };

    TimeTracker entry3 = new TimeTracker() { UserId = 1, LoginTime = new DateTime(2000, 1, 2, 0, 0, 0), LogoutTime = new DateTime(2000, 1, 2, 2, 0, 0) };

    TimeTracker entry4 = new TimeTracker() { UserId = 2, LoginTime = new DateTime(2000, 1, 1, 0, 0, 0), LogoutTime = new DateTime(2000, 1, 1, 1, 0, 0) };

    List<TimeTracker> entryList = new List<TimeTracker>() { entry1, entry2, entry3, entry4 };
    context.TimeTrackers.AddRange(entryList);
    context.SaveChanges();
}

class Context : DbContext
{
    public Context()
    {
        Database.SetInitializer(new CreateDatabaseIfNotExists<Context>());
        Database.Initialize(true);
    }

    public DbSet<TimeTracker> TimeTrackers { get; set; } 
}

public class TimeTracker
{
    public int TimeTrackerId { get; set; }
    public int UserId { get; set; }
    public DateTime LoginTime { get; set; }
    public DateTime LogoutTime { get; set; }
}

下图显示了 SQL Server 中的结果:

接下来,我创建了以下存储过程:

CREATE PROCEDURE GroupByUserAndDate
AS
BEGIN
    SELECT TimeTracker.UserId, CAST(TimeTracker.LogoutTime AS date) AS LogoutDate,  SUM(DATEDIFF(SECOND, TimeTracker.LoginTime, TimeTracker.LogoutTime)) AS TimeSum
    FROM [ef_6_code_first_database_table_not_create.Context].[dbo].[TimeTrackers] AS TimeTracker
    GROUP BY TimeTracker.UserId, CAST(TimeTracker.LogoutTime AS date)
END

这会产生以下结果:

最后,我使用 EntityFramework 调用存储过程:

static void ExecuteStoredProcedure()
{
    Context context = new Context();
    QueryResult[] results = context.Database.SqlQuery<QueryResult>("dbo.GroupByUserAndDate").ToArray();
}

public class QueryResult
{
    public int UserId { get; set; }
    public DateTime LogoutDate { get; set; }
    public int TimeSum { get; set; }
}

【讨论】:

    猜你喜欢
    • 2020-07-09
    • 2020-09-07
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    相关资源
    最近更新 更多