Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按开始和/或结束日期对MySQL中的事件进行排序_Mysql_Sql_Sorting_Date_Sql Order By - Fatal编程技术网

按开始和/或结束日期对MySQL中的事件进行排序

按开始和/或结束日期对MySQL中的事件进行排序,mysql,sql,sorting,date,sql-order-by,Mysql,Sql,Sorting,Date,Sql Order By,我的起始位置如下: 表中包含具有开始和结束日期的事件 我希望使用以下维度对查询中的这些事件进行排序: 当前事件>未来事件>已完成事件 SELECT startAt, endAt, ( CASE WHEN DATE(endAt) > DATE(NOW()) AND DATE(startAt) < DATE(NOW()) THEN 1 WHEN DATE(endAt) > DATE(NOW()

我的起始位置如下:

表中包含具有开始和结束日期的事件

我希望使用以下维度对查询中的这些事件进行排序:

当前事件>未来事件>已完成事件

SELECT 
    startAt,
    endAt,
    (
        CASE
            WHEN DATE(endAt) > DATE(NOW()) AND DATE(startAt) < DATE(NOW()) THEN 1
            WHEN DATE(endAt) > DATE(NOW()) AND DATE(startAt) > DATE(NOW()) THEN 0
            ELSE -1
        END
    ) as position
FROM 
    events
ORDER BY
    position DESC
选择
斯塔塔,
endAt,
(
案例
当DATE(endAt)>DATE(NOW())和DATE(startAt)DATE(NOW())和DATE(startAt)>DATE(NOW())时,则为0
ELSE-1
结束
)作为职位
从…起
事件
订购人
位置描述
现在的问题是:

按三个类别排序适用于上述查询,但在类别中必须应用以下排序:

当前事件(按结束日期排序)>未来事件(按开始日期排序)>已完成事件(按结束日期排序)

因此,首先,所有即将过期的正在运行的事件将按降序排列(即,比以前的事件有更多的时间),然后所有即将开始的未来事件将按降序排列(即,比以前的事件晚开始),然后所有已完成的事件将按降序排列

在@Tim Biegeleisen的帮助下解决

SELECT 
    startAt,
    endAt
FROM 
    events
ORDER BY
    (
        CASE
            WHEN endAt > CURDATE() AND startAt < CURDATE() THEN 1
            WHEN endAt > CURDATE() AND startAt > CURDATE() THEN 0
            ELSE -1
        END
    ) DESC,
    (
        CASE 
            WHEN startAt < CURDATE() THEN endAt 
            ELSE startAt 
        END
    ) ASC
选择
斯塔塔,
恩达特
从…起
事件
订购人
(
案例
当endAt>CURDATE()和startAtCURDATE()和startAt>CURDATE()时,则0
ELSE-1
结束
)描述,
(
案例
当startAt
您可以尝试以下逻辑:

SELECT
    startAt,
    endAt
FROM events
ORDER BY
    CASE WHEN startAt < CURDATE() THEN endAt ELSE startAt END;
Try case语句选择订单日期。
挑选
斯塔塔,
endAt,
(
案例
当DATE(endAt)>DATE(NOW())和DATE(startAt)DATE(NOW())和DATE(startAt)>DATE(NOW())时,则为0
ELSE-1
结束
)作为职位
从…起
事件
订购人
案例
当DATE(endAt)>DATE(NOW())和DATE(startAt)DATE(NOW())和DATE(startAt)>DATE(NOW())时,则startAt
艾尔森达特
结束描述

我认为@Tim Biegeleisen的答案比你的答案要短一些,但无论如何还是要感谢你的回答。我认为你和我的答案是必需的,还是?你想把这三个不同的类别分别分组?你的问题不清楚。对不起:)但我用你的答案解决了它,并在我的问题中添加了完整的答案。
SELECT startAt, endAt
FROM events
ORDER BY
    CASE WHEN endAt > CURDATE() AND startAt < CURDATE() THEN 0
         WHEN endAt > CURDATE() AND startAt > CURDATE() THEN 1
         ELSE 2 END,
    CASE WHEN startAt < CURDATE() THEN endAt ELSE startAt END;
Try case statement to select he date for order.

  SELECT 
    startAt,
    endAt,
    (
        CASE
            WHEN DATE(endAt) > DATE(NOW()) AND DATE(startAt) < DATE(NOW()) THEN 1
            WHEN DATE(endAt) > DATE(NOW()) AND DATE(startAt) > DATE(NOW()) THEN 0
            ELSE -1
        END
    ) as position
  FROM 
        events
  ORDER BY
      CASE
          WHEN DATE(endAt) > DATE(NOW()) AND DATE(startAt) < DATE(NOW()) THEN endAt
          WHEN DATE(endAt) > DATE(NOW()) AND DATE(startAt) > DATE(NOW()) THEN startAt
      ELSE endAt
      END DESC