【问题标题】:get ids for a given date range获取给定日期范围的 ID
【发布时间】:2012-02-15 08:44:28
【问题描述】:
 id   start_date    end_date          
 1    2012-02-05   2012-03-10      
 2    2012-03-05   2012-03-25       
 3    2012-03-19   2012-03-27      
 4    2012-04-01   2012-04-20

Table Name: bulbs

此表包含在给定日期期间灯泡的信息。如果我选择两个日期,我想获取这些日期范围的当前灯泡 ID。例如对于日期 '2012-02-10' 和 '2012-03-20' 这应该返回 ids - 1,2 和 3。我不知道该怎么做。请帮忙。

【问题讨论】:

  • 您的意思是'2012-02-10''2012-03-20'?根据我的理解,2 月 10 日至 20 日应该只给 id 1 吗?你的结束日期是包含还是不包含? (如果查询'2012-03-10''2012-03-20',是否应该返回id 1以及id的2和3?)
  • 是的..我的错误。我已经编辑了我的问题。

标签: mysql sql


【解决方案1】:

我不明白 2012-02-10 和 2012-02-20 如何给你 id 1、2、3,如果我理解这一点,它应该只给 id 1 在这种情况下,SQL 应该是

select id from bulbs where
end_date >= '2012-02-10' and
start_date <= '2012-02-20'

【讨论】:

    【解决方案2】:
    select id 
    from bulbs
    where '2012-02-10' <= start_date
    and ('2012-02-20' between start_date and end_date)
    

    【讨论】:

      【解决方案3】:
      SELECT
        *
      FROM
        bulbs
      WHERE
        start_date <= '2012-02-20'
        AND end_date >= '2012-02-10'
      

      但是,这种类型的查询在处理大量数据时非常缓慢。

      这是因为 (start_date, end_date) 上的索引与仅 (start_date) 上的索引相比没有任何帮助。

      提高性能的一种方法是同时给出开始日期的上限和下限。如果您知道 start_date 和 end_date 之间的最大天数,则可以这样做。

      例如,如果他们相隔不超过 60 天,您可以这样做...

      SELECT
        *
      FROM
        bulbs
      WHERE
            start_date <= '2012-02-20'
        AND start_date >= '2012-02-10' - 60
        AND end_date   >= '2012-02-10'
      

      【讨论】:

      • 这样更好。非常感谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 2020-07-06
      相关资源
      最近更新 更多