【问题标题】:Select only records around a certain time仅选择特定时间附近的记录
【发布时间】:2016-05-23 10:15:21
【问题描述】:

在我的数据库中,每分钟都有一条记录。我只想选择每十五分钟左右创建的每条记录。

以下代码显示了我当前如何执行此查询,但使用语句:v.CreateTime > v.CreateTime < endDate),我只是声明我想在什么日期之间获取数据。

我想要时间为:15, :30, :45, :00 的数据。在那些时候也没有精确地输入数据。例如12:15:23 是可能的,但12:14.43 也是可能的。

vafDataList = service.LoadVesselRecord<VafData>(v => 
      v.TypeNo == RecordObjectTypes.VafData && 
      v.Vessel_No == vesselNo && 
      v.CreateTime > startDate && 
      v.CreateTime < endDate)
  .OrderBy(t => t.CreateTime)
  .ToList();

如何只选择一刻钟左右的记录,而不是所有记录?

【问题讨论】:

  • 您已按创建时间过滤。它有什么问题?
  • 非常微不足道,如果你知道哪个你想要15分钟,那么你所拥有的代码就可以工作。你试过什么?你的问题是什么? “每 15 分钟加载一条记录” 是什么意思?您是要计时器,还是要DateTime.Now.AddMinutes(-15)
  • 你的意思是你想从结果中truncate the seconds
  • @CodeCaster 不,我只想每小时 4 条记录而不是 60 条.. 记录应该是 .15, .30, .45, .00 周围的记录
  • 我不明白你的问题......有什么问题?你想四舍五入你的日期时间吗?

标签: c# database entity-framework filter


【解决方案1】:

您可以简单地选择那些分钟的记录:

.Where(t => new int[] { 0, 15, 30, 45 }.Contains(t.CreateTime.Minute))

但是,假设您的 LoadVesselRecord() 调用在 DbSet 上执行的 Where(),Entity Framework 无法将其转换为查询,因此您必须使用 SqlFunctions 扩展来让 Entity框架将其翻译成DATEPART SQL 语句:

.Where(t => new int[] { 0, 15, 30, 45 }
            .Contains(SqlFunctions.DatePart("minute", t.CreateTime)))

【讨论】:

  • 马上试试这个!在:new int[] { 0, 15, 30, 45 } 上遇到一点错误。无法转换为 IENumerable。所以我想我只是在那之后添加.ToList(),对吧?
  • 您显示的消息不完整。我怀疑您需要将 DatePart 转换为 (int)
  • 现在出现此错误.. Additional information: This function can only be invoked from LINQ to Entities. 我最终没有给出错误的地方:.Where(f =&gt; new int[] { 0, 15, 30, 45 }.Contains(Convert.ToInt32(SqlFunctions.DatePart("minute", f.CreateTime))))
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多