【问题标题】:Query to sort upcoming dates first, ascending, then past dates, descending查询以先排序即将到来的日期,升序,然后是过去的日期,降序
【发布时间】:2012-10-30 09:56:20
【问题描述】:

我有一个事件表,它以下列方式存储日期 (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 然后我想按以下方式对开始日期进行排序

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

谁能帮帮我?

【问题讨论】:

  • 4/32/7 怎么样?

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


【解决方案1】:

您可以在 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

【讨论】:

  • hi thnx 4 query..我已将此查询修改如下:SELECT * FROM event ORDER BY CASE WHEN eventstart >= '10/29/2012' THEN eventstart ELSE '12/31/ 9999' END ASC, CASE WHEN eventstart
  • 除了最后两个值外,输出看起来与您在问题中发布的相似。如果您将日期存储为 VARCHAR,那么这是一个 主意。
【解决方案2】:

以非常简单的方式:

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 函数进行真正的比较,并决定是否要将今天作为 未开始 事件或作为 过去事件。我发布了第一个案例。如果您希望今天成为过去的事件,请从第一个比较中删除等号并将其移至第二个:

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

【讨论】:

    【解决方案3】:
    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'
    

    【讨论】:

    • 感谢您的查询 frnd。但它在执行时显示语法错误。
    猜你喜欢
    • 2023-03-16
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 2022-11-11
    • 1970-01-01
    • 2021-03-24
    • 2017-05-26
    相关资源
    最近更新 更多