首页 文章

使用linq查询选择datetime字段之间具有特定时间 Span 的记录

提问于
浏览
-1

我有一个表,其中包含有关我的用户及其登录日期时间的一些记录,因此该表具有userId和loginDateTime以及其他所需的列 . 该表按userIds分组 .

我想为每个组(实际上每个用户)选择出现在特定时间范围内(例如2小时内)的登录 .

为了更好地说明,查询必须在定义的时间窗格内返回有关特定用户的登录

例如,表格是:

id     userId     loginDateTime
-----  ---------  -----------------------    
1      233        01/01/2015 1:04:22 PM
2      233        01/01/2015 2:01:43 PM
3      234        01/01/2015 1:04:12 PM
4      235        01/01/2015 8:22:54 PM
5      235        01/01/2015 1:51:53 PM
6      234        01/01/2015 12:07:32 PM
7      233        01/01/2015 1:09:18 PM
8      233        01/01/2015 4:14:02 PM

用户“233”和“1小时时间 Span ”的结果必须是这样的

id     userId     loginDateTime
-----  ---------  ------------------------
1      233        01/01/2015 1:04:22 PM
2      233        01/01/2015 2:01:43 PM
7      233        01/01/2015 1:09:18 PM

我正在寻找SQL和等效的LINQ语句 .

2 回答

  • 1

    试试这个:

    DECLARE @userId AS INT
      DECLARE @timestamnp AS INT
    
      SET @userId = 233
      SET @timestamp = -1  --one hour ago from now
    
      SELECT id, userId, loginDateTime FROM myTable 
      WHERE @userId=233 AND loginDateTime>= DATEADD(hh, @timestamp, GETDATE())
    

    更多关于DATEADD

  • 0

    我的linq不是那么好,但你可以从这样的事情开始 . 您还可以尝试使用匿名方法进行选择:

    DataTable table = new DataTable("Logins");
      table.Columns.Add("id", typeof(int));
      table.Columns.Add("userId", typeof(int));
      table.Columns.Add("loginDateTime", typeof(DateTime));
      table.Rows.Add(1, 233, new DateTime(2015, 01, 01, 1, 04, 22));
      table.Rows.Add(2, 233, new DateTime(2015, 01, 01, 2, 01, 43));
      table.Rows.Add(3, 234, new DateTime(2015, 01, 01, 1, 04, 12));
      table.Rows.Add(4, 235, new DateTime(2015, 01, 01, 8, 22, 54));
    
      IEnumerable<DataRow> linkQuery = from times 
                                       in table.AsEnumerable() 
                                       select times;
    
      List<DataRow> listOfTimes = new List<DataRow>();
      DateTime checkAgainst = linkQuery.ElementAt(1).Field<DateTime>("loginDateTime");
      foreach (DataRow row in linkQuery) 
      {
        TimeSpan span = new TimeSpan();
        DateTime checkedRow = row.Field<DateTime>("loginDateTime");
        span = checkAgainst - checkedRow;
        if (span.Hours == 0 && span.Minutes <= 59)
        {
          listOfTimes.Add(row);
        }
      }
    
      Console.ReadKey();
    

    此外,您可能希望修改时间 Span 检查以使其更精确 .

相关问题