如何获得完全覆盖给定时间范围的行?

时间:2015-07-09 06:53:51

标签: sql entity-framework datetime sql-server-2012

我正在构建一个包含javascript图表的Web应用程序。我们的想法是选择一个时间范围,从数据库中获取相关数据(温度),将其传递到页面并在图表中显示。

数据的日期时间不是定期的,因此从一行到下一行,时差可以是一秒钟,也可以是几分钟。

我可以很容易地做到这一切,但我遇到了一个问题:目前,当我想要获取数据时,比方说,08:00到10:00,我可以通过选择datetime字段的行来实现是> = 08:00和datetime字段< = 10:00,伪说话。没关系,但是这给了我几乎每个查询的开头和结尾的空白,因为最后一次。第一个值很可能不等于边界。

我需要给定时间范围内的数据以及范围之前的一个值范围之后的一个值,以便我可以显示连续的行范围的开始结束。

当然,我可以简单地做三个查询:1。获取范围限制内的数据,2。获取范围之前的第一个值,3。获得范围之后的第一个值。这有效,但我想知道是否有更好/更优雅/更高效的方式呢?是否有一些我没有听说过的奇特的SQL函数?我正在使用Entity Framework 6作为ORM。

1 个答案:

答案 0 :(得分:1)

子查询可以为报告窗口提供边界值,从而可以在单个SELECT中获取所需的所有行:

SELECT captureTime, temperature FROM temperatures
WHERE captureTime >= ( 
    SELECT MAX( captureTime ) FROM temperatures
    WHERE captureTime <= '2015-01-01 08:00:00'
) AND captureTime <= (
    SELECT MIN( captureTime ) FROM temperatures 
    WHERE captureTime >= '2015-01-01 10:00:00'
)
ORDER BY captureTime