【问题标题】:SQL: How to select date data from two columns and order it using both columnsSQL:如何从两列中选择日期数据并使用两列对其进行排序
【发布时间】:2026-02-23 02:25:02
【问题描述】:

我正在构建一个 PHP/MySQL 查询,该查询列出了指定时间段内(例如一天)内数据库中的所有预订。所有预订都有开始日期和结束日期。我需要将它们列出,以便它显示它们 1) 按升序显示,其中 start_date/end_date = 在指定期间 2) start_date 和 end_date 可以在该期间内,因此 start_date 应该有 1 个结果,end_date 应该有另一个结果

SELECT *  
FROM `reservations` 
WHERE `start_date` BETWEEN '2017-01-04 00:00:00' AND '2017-01-04 23:59:59' 
   OR `end_date` BETWEEN '2017-01-04 00:00:00' AND '2017-01-04 23:59:00' 
order by start_date, end_date

因此,我需要帮助根据 两列 对结果进行排序,并且对于在指定时间段之间同时具有 start_date 和 end_date 的行具有 重复结果

更新

到目前为止,我已经得到了正确的结果,并且行是根据日期(开始日期/结束日期)升序排列的。 但是,如果我有人在同一天签入(即重复行),我当前的查询会连续列出这些行,尽管我希望根据签出时间对第二行进行排序。

这是我目前所拥有的:

select * from ( SELECT id, start_date, end_date FROM reservations WHERE start_date BETWEEN '2017-01-03 00:00:00' AND '2017-01-03 23:59:59' OR @987654324 @ BETWEEN '2017-01-03 00:00:00' AND '2017-01-03 23:59:00' union all SELECT id, start_date, end_date FROM reservations WHERE start_date BETWEEN '2017-01-03 00:00:00' 和 '2017-01-03 23:59:59' 和 end_date 在 '2017-01-03 00:00:00' 和 '2017-01-03 23:59:00' 之间)作为 tbl 按大小写顺序 WHEN start_date BETWEEN '2017-01-03 00:00:00' AND '2017-01-03 23:59:59' THEN start_date ELSE end_date END ASC

【问题讨论】:

  • 你是要删除重复的结果还是别的什么
  • 您的查询当前按 start_date 升序排序,然后按 end_date 排序(如果两个开始时间相等)。这不是你想要的吗?
  • 我认为他想要的行,其中开始和结束日期适用于条件,结果两次。
  • ORDER BY 目前无法正常工作,因为我希望它可以正常工作。我希望它“组合”两列(start_date,end_date)并将它们按升序排列。目标是按日期和时间按正确顺序打印签入/签出客户列表。

标签: php sql sorting date


【解决方案1】:

您需要 UNION ALL 来复制行,因为 OR 条件将包含一次,您可以添加 AND 条件以仅复制完全属于该日期范围的行,如下所示:

select * from (
    SELECT *  
    FROM `reservations` 
    WHERE `start_date` BETWEEN '2017-01-04 00:00:00' AND '2017-01-04 23:59:59' 
       OR `end_date` BETWEEN '2017-01-04 00:00:00' AND '2017-01-04 23:59:00' 
    union all
    SELECT *  
    FROM `reservations` 
    WHERE `start_date` BETWEEN '2017-01-04 00:00:00' AND '2017-01-04 23:59:59' 
      AND `end_date` BETWEEN '2017-01-04 00:00:00' AND '2017-01-04 23:59:00' 
    ) as tbl
order by start_date, end_date

【讨论】:

  • 相同的结果,但在第一个嵌套查询中仅检查开始日期和在第二个嵌套查询中仅检查结束日期可能更简单。
最近更新 更多