【问题标题】:How to select rows between two different columns with two different input values on same table on mysql如何在mysql的同一张表上选择两个不同列之间具有两个不同输入值的行
【发布时间】:2016-08-29 23:09:10
【问题描述】:

我有一个表名为 Orders。 Orders 表有两列名称分别是 start_date,end_date

S.No     start_date   end_date
 1       2016-04-01   2016-04-08
 2       2016-04-28   2016-05-29
 3       2016-05-01   2016-05-39

现在我想要 2016 年 4 月 1 日开始日期和 2016 年 4 月 30 日结束日期之间的记录。

请帮我解决这个问题

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    这就是你要找的吗?

    select * 
    from Orders 
    where 
        (start_date >= '2016-04-01' and start_date < '2016-05-01'); 
    

    编辑 更新以反映来自 OP 的 cmets。

    SQL Fiddle

    【讨论】:

    • 没有 Mituw。我有两个开始日期和结束日期的日期过滤器。如果我选择开始日期过滤器为 2016-04-05,结束日期过滤器为 2016-04-30,那么两条记录都应该出现,因为第二行开始日期小于过滤器结束日期
    • 我明白了,我将相应地编辑我的答案并更新小提琴。
    • 看到它不正确。如果记录的开始日期为 05,那么它也即将到来。
    • @mallip 你需要清楚地解释你在问什么。正如您所看到的,有 3 个非常不同的答案试图完成大致相同的任务,我们猜测您要完成什么
    • 给您添麻烦了。我想要 2016 年 4 月 1 日开始日期和 2016 年 4 月 30 日结束日期之间的记录。
    【解决方案2】:

    如果您只想要 4/1 - 4/30 的订单,那么:

    SELECT *
    FROM
       orders
    WHERE
       start_date = '2016-4-1'
       AND end_date = '2016-4-30'
    

    如果您想要 于 4 月 1 日开始或于 4 月 30 日结束的订单,则:

    SELECT *
    FROM
       orders
    WHERE
       start_date = '2016-4-1'
       OR end_date = '2016-4-30'
    

    在 OP 评论后编辑

    SELECT *
    FROM
        orders
    WHERE
        start_date between '2016-4-1' AND '2016-4-30'
        OR end_date between '2016-4-1' AND '2016-4-30'
    

    【讨论】:

    • 我运行了这个查询,但没有显示记录。我想要的记录之间不完全匹配的记录
    • 酷,退房
    【解决方案3】:

    假设 start_date 总是 end_date,您可能会通过下面的查询获得更好的结果,因为它在 start_date 过滤器上提供了更多的特异性:

    select * 
    from Orders 
    where start_date between '2016-04-01' and '2016-04-30'
        and end_date between '2016-04-01' and '2016-04-30'
    

    【讨论】:

    • 它只会返回第一行。但我也想要第二排。因为第二行开始日期小于过滤范围
    【解决方案4】:

    假设您想要与范围重叠的记录:

    SELECT *
      FROM orders
     WHERE start_date <= :end_range
       AND end_date   >= :start_range
    

    在你的情况下:

    SELECT *
      FROM orders
     WHERE start_date <= '2016-04-30'
       AND end_date   >= '2016-04-01'
    

    如下所示:

               <---RANGE-->
         <-->                                     X end_date   < :start_range
    R      <---->                                 Returned
    O             <---->                          Returned
    W         <--------------->                   Returned
    S                   <---->                    Returned
                                <-->              X start_date > :end_range
    

    【讨论】:

      【解决方案5】:

      你想要: 从订单中选择 *,其中 start_date 在 '04/01/2016' 和 '04/30/2016' 之间 AND '04/01/2016' 和 '04/30/2016' 之间的 end_date

      【讨论】:

        猜你喜欢
        • 2013-04-18
        • 2014-12-01
        • 1970-01-01
        • 2017-11-11
        • 1970-01-01
        • 2017-01-26
        • 1970-01-01
        • 2012-03-03
        • 2012-05-29
        相关资源
        最近更新 更多