我创建了一个简单的日历,一方面是时间点,另一方面是时间段。
MySQL表(一个多数为0的块表示:此处没有实际值,因为它是一个时间点,而不是一段时间)
+-------+------------+------------+-------------+-------------+
| title | timepoint1 | timepoint2 | timeperiod1 | timeperiod2 |
+-------+------------+------------+-------------+-------------+
| ABC | 2015-07-12 | 12:30:00 | 0000-00-00 | 0000-00-00 |
| UPS | 2015-07-12 | 15:00:00 | 0000-00-00 | 0000-00-00 |
| DEF | 2015-07-30 | 08:00:00 | 0000-00-00 | 0000-00-00 |
| HIJ | 0000-00-00 | 00:00:00 | 2015-07-16 | 2015-07-31 |
| KLM | 0000-00-00 | 00:00:00 | 2015-08-21 | 2015-08-25 |
+-------+------------+------------+-------------+-------------+
我想要这样的输出
+-------+--------------------------+
| title | when? |
+-------+--------------------------+
| ABC | 2015-07-12 12:30 |
| UPS | 2015-07-12 15:00 |
| HIJ | 2015-07-16 to 2015-07-31 |
| DEF | 2015-07-30 8:00 |
| KLM | 2015-08-21 to 2015-08-25 |
+-------+--------------------------+
正如你所看到的,我想按照他们的开始时间(无论是时间点还是一段时间)订购所有标题,也许包括12点等时间。
但是我应该如何编写查询,尤其是ORDER BY部分。如何添加WHERE子句,该子句仅选择此月或下个月的会议?
答案 0 :(得分:1)
你可以将这两个字段合并并按顺序排列。
ORDER BY CONCAT(`timepoint1`,' ',`timepoint2`) ASC
看到某些字段可能为空,那么您将使用IF语句,例如:
ORDER BY CONCAT(IF(`timepoint1`!='0000-00-00',`timepoint1`,`timeperioid1`),' ',`timepoint2`) ASC
答案 1 :(得分:1)
SELECT title
, IF(timepoint1 = '0000-00-00'
, CONCAT(timeperiod1, " to ", timeperiod2)
, CONCAT(timepoint1, ' ', timepoint2)
) AS `when?`
FROM the_table
ORDER BY GREATEST(timepoint1, timeperiod1), timepoint2, timeperiod2
;
那就是说,为什么不只有两个DATETIME或TIMESTAMP字段("来自"和"到")? "时期"会使用' 00:00'时间,或者"点"会有"来自"和"到"彼此相等,或者可以有一个额外的"类型"某种领域。第一条评论也显示了一个很好的方式来涵盖一天的时间"。