我必须在表中及时找到最接近的事件。 如果三天前发生了一个事件,而下一个事件将在明天发生,那么我要第二个事件。反之,如果昨天发生了一个事件,下一个事件将在下个月发生,我想要第一个事件。
因此,我根据日期之间以秒为单位的绝对差(不超过1个结果)来编写查询。
在伪SQL中类似:
select * from events order by ABS(UNIXTIME(kickoff) - UNIXTIME(now)) limit 1
在LINQ中:
Context.Events.OrderBy(m => Math.Abs( m.KickOff - DateTime.UtcNow ).TotalSeconds ).FirstAsync();
可以,但是order by是在内存中而不是在SQL中组成的。 LINQ表达式'orderby Abs(([[m] .KickOff-DateTime.UtcNow).TotalSeconds)asc'无法翻译,将在本地进行评估。“
如何在sql中通过查询执行订单?
编辑
删除Abs
Context.Events.OrderBy(m => m.KickOff - DateTime.UtcNow ).FirstAsync();
根据需要工作
[...] ORDER BY `m`.`kickoff` - UTC_TIMESTAMP()
但是它没有给我我期望的结果
答案 0 :(得分:0)
假设您正在使用Entity Framework
和SQL Server
,则可以在SqlFunctions.DateDiff
中使用System.Data.Entity.SqlServer
:
Context.Events.OrderBy(m => Math.Abs(SqlFunctions.DateDiff("ss", DateTime.UtcNow, m.KickOff)))
.FirstAsync();
这假设now
为开始日期,kick off
为结束日期。您可以根据需要交换它们。