当前位置: 首页 > 面试题库 >

SQL中的日期范围交集

鲁成天
2023-03-14
问题内容

我有一个表,其中每一行都有开始和结束日期时间。这些可以是短跨度或长跨度。

我想查询具有两个开始和停止日期时间的所有行的交集的总持续时间。

如何在MySQL中做到这一点?

还是必须选择与查询开始和结束时间相交的行,然后计算每行的实际重叠并将其累加到客户端?

举个例子,使用毫秒使它更清晰:

一些行:

ROW  START  STOP
1    1010   1240
2     950   1040
3    1120   1121

我们想知道这些行在1030和1100之间的总时间。

让我们计算每行的重叠:

ROW  INTERSECTION
1    70
2    10
3     0

因此,本例中的总和为80。


问题答案:

如果您的示例在第一行中说了70,则

假设@range_start和@range_end作为条件参数:

SELECT SUM( LEAST(@range_end, stop) - GREATEST(@range_start, start) )
FROM Table
WHERE @range_start < stop AND @range_end > start

使用最大的/最小和日期函数,您应该能够直接在日期类型上获得所需的内容。



 类似资料:
  • 问题内容: 我在elasticsearch中存储以下信息: 假设我还有另一个日期范围(例如,从用户输入中得出),我想搜索一个相交的时间范围。与此类似:确定两个日期范围是否重叠这概述了以下逻辑: 但是我不确定如何将其放入elasticsearch查询中,我会使用范围过滤器并且仅将“ to”值设置为,而将from留为空白吗?还是有一种更有效的方法? 问题答案: 更新:现在可以使用在elasticsea

  • 问题内容: 我有一张可以容纳一年中所有天/月的表 例如 我有一张表格,显示来自不同数据集的日期范围 例如 我如何比较这两个表以显示该特定月份的数据集中缺少哪些日期 对于上面示例中的数据集所在的示例,EG缺少日期范围01/09/2013-19/09/2013 谢谢你的帮助! 问题答案: 您可以使用CTE并通过以下方式编写查询:

  • 问题内容: 我正在尝试对此表进行查询: 我想获得输出: 我想得到那个结果,所以我会知道什么时候开始赚钱,什么时候停止钱。我还对开始花钱之前的月份数(这解释了第一行)以及停止钱的月份数(这解释了为什么我也对2013年7月至2013年8月的第三行感兴趣)感兴趣。 )。 我知道我可以在日期上使用min和max,在金额上使用sum,但是我不知道如何以这种方式划分记录。 谢谢! 问题答案: 这是一个主意(和

  • 问题内容: 我有一个表,例如此数据 我想有一个查询,将日期分开,所以我有像这样一年中分开的金额: 2013年有25个月是因为2013年有1个月,而2014年有75个月是因为有3个月 有没有办法在T-SQL中做到这一点? 提前谢谢! 问题答案: 使用表格创建日历表格,然后将其加入表格以将日期范围划分为所需的任何部分。 如果按年份除以金额,然后除以月份,您可以: 这是SQL FIDDLE DEMO。

  • > 每个对象表示一个重复发生的事件。该事件可以在多个日期发生。因此,请考虑以下内容: 我有一个日历在客户端,用户可以选择一个日期范围。 > 对所选日期范围的每个条目进行调用,并在客户端处理聚合。问题是会有大量的读取,因为我们会多次读取重叠的日期范围内的同一个列表对象。 尝试使用类似ElasticSearch/Algolia的服务来完成此操作 任何建议都会很有帮助!

  • 问题内容: 最近我被告知,在SQL中使用该方法有些不可靠,因此我应该使用。但是,另一位程序员告诉我不是这种情况,只要日期格式正确,该方法就可以在所有情况下出色地工作。 请有人通过说明哪种方法更好以及为什么来解决这场辩论。 目前,我的日期范围SQL如下所示: 但是,如果可以确定它是可靠的,我宁愿这样写: 在这种情况下,我使用的是MsSQL,但是我已经标记了MySQL,因为我想知道这在这里是否也适用