2009-10-14 81 views
1

我有一个简单的任务列表,其中包含标题字段和截止日期字段。有些任务有截止日期,其他任务没有。截止日期只是存储在MySQL日期类型中。使用MySQL排序最近的日期

但是最困难的(我反正)是按照正确的顺序对任务进行排序:

  1. 升序限期
  2. 其余的(也许ID,但并不重要)

目前查询:

SELECT * FROM tasks ORDER BY deadline ASC 

的截止日期字段为 '0000-00-00' 在默认情况下,所以这QUER Ÿ将呈现以下顺序的任务:

  1. 任务,没有最后期限
  2. 升序期限

任何人都可以点我在正确的方向,或者我需要做多个查询?

+3

为什么没有最后期限被默认为空? – 2009-10-14 14:10:27

回答

3
SELECT * FROM tasks 
ORDER BY CASE WHEN deadline = '0000-00-00' 
       THEN '9999/09/09' 
       ELSE deadline 
     END ASC 

排序时,替换“0000-00-00”:“9999/09/09” 。

+0

这个作品很有魅力,谢谢! – 2009-10-15 08:11:52

2

如果用户没有输入截止日期,一个明显的可能性是(在创建项目的应用程序中)在未来(如'9999-12-31')设置截止日期的方式。当然,目前还不清楚是否可以由“大” datetime值更改代码或不...

+0

实际上,字段类型日期默认为空,所以你是对的。我可以改变代码,但是用查询解决它不是更容易。 – 2009-10-14 17:13:40

+0

可能 - 如果它是空的,那么(正如其他人已经指出的那样),在查询中处理它是非常微不足道的。对于这个问题,如果它是“0000-00-00”,你可以在查询中处理它,但是我会更加关心这个问题 - 我可以看到有人真正输入了它(如果你让它们),意思是“立即”。 – 2009-10-14 17:51:56

1

难道真的是0000-00-00?该docs说:

“支持的范围是‘1000年1月1日’到‘9999-12-31’。”

我会考虑在储存期限为NULL那些不这样做有一个。

SELECT * FROM tasks ORDER BY ifnull(deadline, '9999-12-31') ASC 
+0

你是对的。默认情况下它是空的,但是代码插入了0000-00-00,但是我可以改变它。尽管字段类型不是日期时间,但是日期。 – 2009-10-15 06:54:03

+0

你试过查询吗? – 2009-10-15 07:32:26

0

使用藏在哪里你的任务没有截止日期:

SELECT * FROM tasks WHERE deadline != '0000-00-00' ORDER BY deadline 
+0

对我来说这看起来不像是有效的SQL,MySQL似乎同意。 – 2009-10-15 07:34:47

+0

wops,我转换位置和订购。 – knittl 2009-10-15 07:42:18

+0

据我所知,他想列出所有的任务,但没有截止日期之后的所有任务排序。 – 2009-10-15 08:06:59

0

您也可以尝试使用SELECT DISCTINCT