查询首先对即将到来的日期,升序,过去日期,降序进行排序

时间:2012-10-30 09:56:21

标签: php mysql sql date sql-order-by

我有一个事件表,以下列方式存储日期(m / d / Y)

eventid     eventstart      eventend    status
----------------------------------------------
      1     10/9/2012       10/27/2012  Active
      2     4/3/2012        4/27/2012   Active
      3     10/26/2012      10/27/2012  Active
      4     2/7/2012        2/9/2012    Active
      5     10/30/2012      10/31/2012  Active
      6     10/9/2012       10/31/2012  Active
      7     11/9/2012       10/19/2012  Active
      8     10/31/2012      10/18/2012  Active

如果我有输入日期,例如10/29/2012然后我想以下列方式对startdate进行排序

eventstart          
----------
10/30/2012
10/31/2012 
11/9/2012
10/26/2012
10/9/2012
10/9/2012

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

您可以使用order by子句中的CASE syntax分别对两种情况进行排序:

SELECT *
FROM `events`
ORDER BY 
    CASE WHEN eventstart >= '2012-10-29' THEN eventstart ELSE '9999-12-31' END ASC, 
    CASE WHEN eventstart <  '2012-10-29' THEN eventstart ELSE NULL         END DESC

-- eventid | eventstart
-- --------+-----------
-- 5       | 2012-10-30
-- 8       | 2012-10-31
-- 7       | 2012-11-09
-- 3       | 2012-10-26
-- 1       | 2012-10-09
-- 6       | 2012-10-09
-- 2       | 2012-04-03
-- 4       | 2012-02-07

答案 1 :(得分:1)

以一种非常示意性的方式:

select * from tablename where eventstart >= '10/29/2012' order by eventstart asc
union
select * from tablename where eventstart < '10/29/2012' order by eventstart desc

第一行将获得未启动的事件,按升序排序,第三行将获得其余部分。

然后您应该设法真正将这些日期与SQL函数进行比较,并确定您是否希望今天包含 unstarted 事件或过去事件。我发布了第一个案例。如果您希望今天成为过去的事件,请从第一次比较中删除相等的符号并将其移至第二个符号:

select * from tablename where eventstart > '10/29/2012' order by eventstart asc
union
select * from tablename where eventstart <= '10/29/2012' order by eventstart desc

答案 2 :(得分:0)

select * from event where EXTRACT(MONTH FROM str_to_date(eventstart, '%d/%m/%Y'))>=EXTRACT(MONTH FROM str_to_date('10/29/2012', '%d/%m/%Y'))
and eventstart >'10/29/2012'
union
select * from event where EXTRACT(MONTH FROM str_to_date(eventstart, '%d/%m/%Y'))>=EXTRACT(MONTH FROM str_to_date('10/29/2012', '%d/%m/%Y'))
and eventstart <'10/29/2012'