【问题标题】:Select dates from the future or past, if future is not available如果未来不可用,请选择未来或过去的日期
【发布时间】:2018-04-12 23:03:48
【问题描述】:

我有一个带有日期列的简单事件表。我可以轻松选择 接下来的 n 个事件(假设 n = 3):

SELECT * FROM events WHERE `date` > NOW() ORDER BY `date` LIMIT 3

不过,未来不会有 3 场赛事。在这种情况下, 我想退回将来可用的并完成 与最接近今天的人一起失踪。例如,如果今天是第 12-04 天,则 应从整个列表中选择以下标有* 的日期:

10-03
20-03
30-03 *
10-04 *
20-04 *

虽然我可以轻松检查第一个查询的结果以了解如何 返回许多行并构建另一个查询以查找过去的日期 如有必要,我很想知道是否有办法获取这些 单个查询中的行。

【问题讨论】:

    标签: mysql sql database date


    【解决方案1】:

    您可以在order by 中使用多个键。所以:

    SELECT e.*
    FROM events
    ORDER BY (date > now()) DESC,  -- future events first
             (CASE WHEN date > now() THEN date END) ASC -- nearest future events first
             date DESC  -- other dates in descending order
    LIMIT 3;
    

    如果您的表很大,获取近期和近期的三个事件并将它们组合起来可能会更快:

    select e.*
    from ((select e.*
           from events e
           where date > now()
           order by date asc
           limit 3
          ) union all
          (select e.*
           from events e
           where date <= now()
           order by date desc
           limit 3
          )
         ) e
    order by date desc
    limit 3;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多