这是一个广告客户联系客户的数据库,需要按标准订购:
如果未指定日期,则它是无关联的联系人,应列在底部。
如果指定了日期但没有指定时间,那么它应该列在该日期的底部。
字段'contact_request'是DATETIME
因此,目标:
所以期望的结果是这样的(最后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'会在那里引发错误,但无论如何这都是一个简单的错误)
答案 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小时会使它在每天都持续