【问题标题】:Compare past dates in LINQ在 LINQ 中比较过去的日期
【发布时间】:2015-02-15 06:49:29
【问题描述】:

我必须编写一个 LINQ 语句来查找过去 90 天内某个项目在数据库中出现的次数。这很容易,但他们希望查看 1-30 天、31-60 天和 61-90 天的数据。

我目前正在做的是创建一个包含四组数据的模型,获取所有唯一 SKU 的列表,然后找出它们在数据库中出现的次数。

我的问题是日期范围。我正在创建新的 DateTime 对象并向它们添加 NEGATIVE 天,我正在尝试使用它来比较范围。我不知道该怎么说这样的话:

编辑日期介于(-30 天)和(-60 天)之间。

我不能为此使用 SP。必须有一个更简单的方法。也许使用时间跨度并查看它是否属于该跨度?我不确定。我很少处理日期。

【问题讨论】:

  • 在日期时间中添加负数天数没有错。另外,如果他们只想要它出现的次数,你为什么需要数据集?只需将 .Count() 添加到您的 LINQ 查询并直接获取数字。
  • @Mathieu。我正在添加 .Count() 但我无法获得正确的日期过滤器。它返回 0 是因为(正如我在下面发布的)我正在反向比较日期。

标签: c# linq datetime


【解决方案1】:

类似:

DateTime today = DateTime.Today;
DateTime minusThirty = today.AddDays(-30);
DateTime minusSixty = today.AddDays(-60);

// Normally I wouldn't use a query expression for just a single where clause,
// but I assume you want more...
var query = from item in db.Table
            where item.Date >= minusSixty && item.Date < minusThirty
            select item;

可能想要&lt;=&gt; - 你应该自己解决这个问题。但是,您几乎肯定希望 one 一定是包容性的,而 one 一定是独占性的,并且始终如一地使用它们 - 这样任何项目最终都不会放在一个以上的桶中。

【讨论】:

  • 啊,我真笨。这正是我所拥有的,只是我正在反向比较日期,这就是为什么我一直得到 0。*掌心
  • @Chase:庆幸你没有做更复杂的事情。日期和时间运算可能会变得困难...noda-time.blogspot.com/2010/11/joys-of-datetime-arithmetic.html
  • 我很高兴。我最常使用的日期是捕获对象添加到数据库的日期和/或在返回时将该日期格式化为字符串。哈哈。
【解决方案2】:
DateTime date1 = DateTime.Now().AddDays(-30);
DateTime date2 = DateTime.Now().AddDays(-60);

if (yourDate.Date >= date2.Date && yourDate.Date <= date1.Date)
{
   //DoSomething
} 

【讨论】:

  • 不要打电话给DateTime.Now 两次——你最终可能会在两者之间更改日期。基本上你希望你的两个日期基于同一时间。
【解决方案3】:

当您不确定您的结构时,很难编写 LINQ 查询。但是要获得该日期范围,您可以在代码中执行以下操作:

var difference = laterDate - earlierDate;

if (difference <= TimeSpan.FromDays(60) && difference >= TimeSpan.FromDays(30)) ...

【讨论】:

    【解决方案4】:

    这似乎对我有用 VB.NET 3.5 返回过去 10 分钟内的项目列表...我相信它可以调整以满足您的需求

        ' if online time is greater than 10 minutes ago pickup user                                check onLineTime.Date = now.AddMinutes(-10).Date              check onLineTime.TimeOfDay = now.AddMinutes(-10).TimeOfDay
         Dim rsl = From s In db.tblSessions Where (s.SessionID <> context.Session.SessionID AndAlso s.onLineTime.Date = DateTime.Now.AddMinutes(-10).Date AndAlso s.onLineTime.TimeOfDay > DateTime.Now.AddMinutes(-10).TimeOfDay)
    

    其中 s.onLineTime 是一个 SQL DATETIME 字段,即。 2015-02-11 04:49:26.283

    【讨论】:

      【解决方案5】:

      你为什么不做类似的事情

              TimeSpan beginning = TimeSpan.FromDays(30);
              TimeSpan end = TimeSpan.FromDays(60);
      
              var query = from item in database
                          let difference = DateTime.Now - item.TimeStamp
                          where difference > beginning &&
                                difference < end
                          select item;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-03
        • 2020-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-01
        • 1970-01-01
        • 2012-02-07
        相关资源
        最近更新 更多