【问题标题】:Who had the car during July谁在七月有车
【发布时间】:2014-10-31 00:45:13
【问题描述】:

所以我有一个包含startendtaxidriver 的表。 City 现在希望按月获取历史查询,了解当月谁乘坐了哪辆出租车,以及发生任何变化的时间。

因此,这会抓取从 2014 年 7 月开始、在 2014 年 7 月结束或正在进行中的分配行(在 7 月之前开始并在该月之后结束或尚未结束)。

我的问题是是否有更有效或更优雅的查询来获取这些行?

SELECT * FROM `taxi_assignments` WHERE 
    (`start` BETWEEN '2014-07-01 00:00:00' AND '2014-07-31 23:59:59')
    OR (`end` BETWEEN '2014-07-01 00:00:00' AND '2014-07-31 23:59:59')
    OR (`start` < '2014-07-01 00:00:00' AND 
        (`end` > '2014-07-31 23:59:59' OR `end` = '0000-00-00 00:00:00')
    )

【问题讨论】:

  • 你为什么不只检查一个月。 IE。 (MONTH(start) = 7 OR MONTH(end)=7 OR (MONTH(start) &lt; 7 AND (MONTH(end) &gt; 7 or MONTH(end) = 0))
  • 这将获得 2012 年 7 月、2013 年等的分配,他们想要 Y 年 X 月的记录。
  • @shell,不要使用这样的功能 - 它会阻止引擎使用任何索引。
  • @prix 但数据不太一样,请参阅sqlfiddle.com/#!2/3a60a/1
  • @jerrygarciuh 我明白了,那么您需要 Jim 的解决方案,它会考虑到这些日期,您需要从 0000-00-00 00:00:00 切换到 NULL 以便 IS NULL 可以正确捕获最后一个.

标签: mysql sql date-range


【解决方案1】:

规范范围重叠检查是:

(a.start < b.end or b.end is null) and (a.end > b.start or a.end is null)

假设

  1. start的正确排序end
  2. 时间范围在右侧半开,即范围包括开始时刻但不包括结束时刻
  3. null 用于尚未完成的范围内的结束日期
  4. 开始日期不能为空

在您的情况下,a 代表表中的数据,而 b 代表 7 月份,所以

b.start = 2014-07-01 00:00:00 
b.end   = 2014-08-01 00:00:00

【讨论】:

  • a 和 b 在您的示例中不是表别名,对吗?
  • @jerrygarciuh 我猜是LEFT JOIN
  • 这是确定两个日期范围何时重叠的通用解决方案。我猜你的情况a 是表中的数据,b 是代表七月的范围。
  • 谢谢!这确实有帮助!
  • 在第一组括号中,OR b.end IS NULL 是否允许end 为空的任何行?例如(start end 为空)和(end > '2014-6-01 00:00:00' 或 end 为空) ORDER BY start 将选择从 8 月开始且结尾为 NULL 的行,对吗?
【解决方案2】:

例如,这将获取 2012 年 2 月以后的信息。我还包括一个字段,将您的出租车标记为正在使用中或结束日期。

SELECT Year(start), Month(start),driver, taxi, 
case when end > MONTH(getdate()) or end is null then 'Active' else end
FROM `taxi_assignments` WHERE 
year(start)>2012 and month(start)> 2

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    相关资源
    最近更新 更多