2012-12-07 92 views
1

我有一个varchar列,我有日期时间值,现在字符串值。我需要按日期时间值排序,并列出底部的所有字符串值。我有以下日期时间:SQL按日期时间排序,然后按字符串

ORDER BY CAST(q2.[Due Date] AS DATETIME) 

但是我的结果在整个结果中都有“暂停”的值。我需要“保持”在列表的底部。

回答

2

如果唯一的非日期值是“待定”,那么这应该在大多数SQL引擎的工作方式:

order by (case when q2.[Due Date] = 'On Hold' then 0 else 1 end) desc, 
     (case when q2.[Due Date] <> 'On Hold' then cast(q2.[Due Date] as datetime) end) 

但是,如果您将日期存储为字符串,那么请使用'YYYY-MM-DD HH:MI:SS'格式。这将允许您排序它们而不必进行转换。

如果他们在此格式下,你可以使用类似:

order by (case when left([Due Date], 1) between '0' and '9' then 0 else 1 end), 
     [Due Date] 

(只是通过[到期日]在多数情况下工作,因为之前的字母数字排序顺序然而,任意字符串可以从其他非alpha字符开始。)

+0

,除非我将一个值的测试更改为isdate(),允许字符串值通过,对于日期值 – Beth

+0

@Beth返回null。 。 。我说过这对大多数SQL引擎都有效。 'isDate'特定于SQL Server和Sybase。 –

+0

感谢Gordon,你的第二个想法像魅力一样工作。 – RamonaA

2

不知道你的平台是什么,但在SQL Server,你可以这样写:

SELECT q2.[Due Date] 
FROM yourTable q2 
ORDER BY ISDATE(q2.[Due Date]) DESC; 
+0

这一个没有工作。我还有我的日期混入了我的暂停。谢谢 – RamonaA

相关问题