SQL:如果没有结束日期,则为开始日期排序

时间:2016-02-26 07:34:18

标签: mysql sql sorting

我创建了一个小小的SQL小提琴:http://sqlfiddle.com/#!9/1cbee/1

我想对这些值进行排序:

INSERT INTO ForgeRock
    (`id`, `title`, `startdate`, `enddate`)
VALUES
    (1, 'Test 1', '2015-12-01 13:30:00', '0000-00-00 00:00:00'),
    (2, 'Test 2', '2015-12-01 14:30:00', '0000-00-00 00:00:00'),
    (3, 'Test 3', '2016-01-01 10:30:00', '2016-01-01 14:30:00'),
    (4, 'Test 4', '2016-01-01 09:30:00', '2016-01-01 15:30:00');

使用SQL。问题是:我想根据开始日期对其进行排序 - 如果有结束日期,我想按结束日期排序。

结果应为:

    (2, 'Test 2', '2015-12-01 14:30:00', '0000-00-00 00:00:00'),
    (1, 'Test 1', '2015-12-01 13:30:00', '0000-00-00 00:00:00'),
    (4, 'Test 4', '2016-01-01 09:30:00', '2016-01-01 15:30:00');
    (3, 'Test 3', '2016-01-01 10:30:00', '2016-01-01 14:30:00'),

所以第一项应该按降序显示。所有带结束日期的项目都应显示在(!)没有结束日期的项目之后。

任何想法如何解决?

4 个答案:

答案 0 :(得分:2)

试试这个:

SELECT
  title,
  startdate,
  enddate
FROM
  ForgeRock
ORDER BY 
   CASE WHEN enddate = '0000-00-00 00:00:00' THEN 0 ELSE 1 END,
   enddate DESC, 
   startdate DESC

这将显示所有没有结束日期的项目,然后是所有带有结束日期的项目。

答案 1 :(得分:0)

如果您没有无效日期,可以使用以下查询

SELECT
  title,
  startdate,
  enddate
FROM
  ForgeRock
order by startdate,enddate

答案 2 :(得分:0)

0000-00-00是无效日期

您可能需要将其更改为null

<强>查询

SELECT
  title,
  startdate,
  enddate
FROM
  ForgeRock
ORDER BY 
   CASE WHEN enddate = '0000-00-00 00:00:00' /* or enddate IS NULL */
   THEN startdate END DESC,
   enddate DESC;

答案 3 :(得分:0)

如果StartDate和End Date的数据类型是varchar,那么您可以使用以下查询 -

   select * from ForgeRock
   order by 
     Case when enddate = '0000-00-00 00:00:00'
              Then '9999-12-31 00:00:00'
          Else enddate END desc, 
     startdate desc