MySQL按4个字段日期和时间排序

Posted

技术标签:

【中文标题】MySQL按4个字段日期和时间排序【英文标题】:MySQL sort by 4 fields date and time 【发布时间】:2021-09-02 23:10:06 【问题描述】:

我有一个表格,其中有 2 个日期列和 2 个时间列(到达日期、到达时间、出发日期、出发时间)

我想将 2 个日期字段合二为一,然后按日期、到达时间、出发时间排序。

所以我想要实现的是按顺序显示接下来x天的到达和离开。

从这里:

+--------------+--------------+----------------+----------------+--+
| arrival date | arrival time | departure date | departure time |  |
+--------------+--------------+----------------+----------------+--+
| 20-06-21     | 06:00        | NULL           | NULL           |  |
| 19-06-21     | 08:00        | 24-06-21       | 08:00          |  |
| NULL         | NULL         | 20-06-21       | 08:00          |  |
+--------------+--------------+----------------+----------------+--+

到这里:

+----------+--------------+----------------+
| date     | arrival time | departure time |
+----------+--------------+----------------+
| 19-06-21 | 08:00        | NULL           |
+----------+--------------+----------------+
| 20-06-21 | 06:00        | NULL           |
+----------+--------------+----------------+
| 20-06-21 | NULL         | 08:00          |
+----------+--------------+----------------+
| 24-06-21 | NULL         | 08:00          |
+----------+--------------+----------------+

这是我现在的查询:

SELECT * FROM `bookings` WHERE STR_TO_DATE(`arrivalDate`, '%d-%m-%y') >= NOW() 
AND STR_TO_DATE(`arrivalDate`, '%d-%m-%y') <= DATE(DATE_ADD(NOW(), INTERVAL +20 DAY))  
OR STR_TO_DATE(`departureDate`, '%d-%m-%y') >= NOW() AND STR_TO_DATE(`departureDate`, '%d-%m-%y') <= DATE(DATE_ADD(NOW(), INTERVAL +20 DAY))
ORDER BY STR_TO_DATE(`arrivalDate`, '%d-%m-%y') asc, 
STR_TO_DATE(`arrivalTime`, '%h:%i') asc,  
STR_TO_DATE(`departureDate`, '%d-%m-%y') asc,  
STR_TO_DATE(`departureTime`, '%h:%i') asc

【问题讨论】:

WHERE STR_TO_DATE(... 性能极差 【参考方案1】:

您首先需要将到达和离开时间分成两行(例如,在您的数据中,3 行变为 4 行)。只有这样你才能对它们进行排序:

SELECT *
FROM (
    SELECT arrivalDate AS date, arrivalTime, NULL AS departureTime
    FROM t
    WHERE arrivalDate IS NOT NULL

    UNION ALL

    SELECT departureDate, NULL, departureTime
    FROM t
    WHERE departureDate IS NOT NULL
) AS sq1
ORDER BY date, COALESCE(arrivalTime, departureTime)

在上面的示例中,您必须将日期字符串替换为 STR_TO_DATE(...)

Demo on db<>fiddle

【讨论】:

谢谢,但我收到此错误:“订单子句”中的未知列“到达时间” 错字或大小写不匹配问题。 看起来不错!但是我如何排除 0000-00-00 日期和 NULL 或 00:00:00 次?因为我得到这样的结果:0000-00-00, NULL, 00:00:00 OR 2021-06-12, NULL, NULL 通过更改 WHERE 子句排除它们,例如WHERE departureDate &lt;&gt; '0000-00-00' AND departureTime IS NOT NULL。最好将日期存储为 DATE 并将时间存储为 TIME 数据类型。

以上是关于MySQL按4个字段日期和时间排序的主要内容,如果未能解决你的问题,请参考以下文章

问SQL,按日期和时间两个字段排序?

PHP 和 MySQL:按最近日期排序并限制 10

Mongodb 按日期排序

MySQL 按日期排序和布尔优先级:数字到日期的怪异

MySQL:按日期选择前 5 个和后 5 个条目,1 个查询,没有子查询

PHP:按可用日期和可用时间排序