【问题标题】:SQL: Sort for start date if there is no end dateSQL:如果没有结束日期,则按开始日期排序
【发布时间】:2016-06-09 07:58:35
【问题描述】:

我创建了一个小 SQL-fiddle: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'),

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

任何想法如何解决这个问题?

【问题讨论】:

  • 对不存在的值使用 NULL,而不是无效的日期 0000-00-00。然后你可以做ORDER BY COALESCE(enddate, startdate) DESC
  • 您好,我使用的 CMS 默认使用 0000-00-00 00:00:00。不幸的是,我无法改变这一点。
  • 希望 CMS 永远不会切换到另一个 DBMS 后端,这不是一个有效的时间戳 :-)

标签: mysql sql sorting


【解决方案1】:

试试这个:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      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;
      

      【讨论】:

        【解决方案4】:

        如果 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
        

        【讨论】:

          猜你喜欢
          • 2023-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-01
          • 1970-01-01
          • 2022-01-23
          相关资源
          最近更新 更多