按日期时间排序,最后留空时间

时间:2017-04-21 12:34:01

标签: mysql

这是一个广告客户联系客户的数据库,需要按标准订购:

  1. 如果未指定日期,则它是无关联的联系人,应列在底部。

  2. 如果指定了日期但没有指定时间,那么它应该列在该日期的底部。

  3. 字段'contact_request'是DATETIME

    因此,目标:

    1. 无日期条目(0000-00-00 00:00:00)应列在表的末尾。
    2. 应在日期结束时列出永久性条目(%00:00:00)。
    3. 所以期望的结果是这样的(最后00:00:00,否则排序ASC):

      HorizontalAlignment="Stretch"

      这使得错误的序列(4,1,5,3,2,...而不是正确的4,1,5,2,3,...):

      2017-01-21 09:00:00 | 1
      2017-03-21 00:00:00 | 2
      2017-03-22 11:00:00 | 3
      2017-01-18 10:00:00 | 4
      2017-03-21 10:00:00 | 5
      0000-00-00 00:00:00 | 6
      0000-00-00 00:00:00 | 7
      

      无法弄清楚怎么做?

      SQLFiddle:http://sqlfiddle.com/#!9/5c6c3/6(没有'0000-00-00 00:00:00'会在那里引发错误,但无论如何这都是一个简单的错误)

3 个答案:

答案 0 :(得分:2)

您正在考虑这个结果,因为您给的所有时间戳都没有合格的时间相同的值,因此在不合格的日期之前将所有时间段分组到最后。

您的case声明必须更复杂才能实现您的目标:

ORDER BY 
  CASE 
    WHEN contact_request = '0000-00-00' THEN 1
    ELSE 2 
  END, /* not qualified dates at the end */
  DATE_FORMAT(contact_request , '%Y%m%e'), /* then order by day */
  CASE 
    WHEN contact_request LIKE '%00:00:00' THEN 2
    ELSE 1
  END, /* not qualified times at the end of each day */
  contact_request /* finally order by whole timestamp */

答案 1 :(得分:0)

您可以使用以下查询:

SELECT *
FROM yourTable
ORDER BY
IF(contact_request = '0000-00-00 00:00:00'
    ,'9999-12-31 23:59:59'
    ,IF(TIME(contact_request) = '00::00:00'
            , ADDTIME('2017-01-01 00:00:00','23:59:59')
            , contact_request  ) ASC;

答案 2 :(得分:0)

ORDER BY 
CASE when replace(CONTACT_REQUEST,'00:00:00','24:00:00) = '0000-00-00 24:00:00' 
     then 2 else 1 end 

假设contact_Request的字符串数据类型。

这是有效的,因为日期存储为字符串,24不是有效时间,但00小时制成24小时会使它在每天都持续