按降序排序 - 月,日和年

时间:2011-01-13 02:10:31

标签: sql sql-server

这看起来很愚蠢但是,我只需要一个日期列表,以最近的日期排在最前面。使用order by DESC似乎没有按照我想要的方式工作。

SELECT     *
FROM         vw_view
ORDER BY EventDate DESC

它给出了按月和日排序的日期,但不考虑年份。 例如:

12/31/2009 

12/31/2008

12/30/2009

12/29/2009

需要更像:

12/31/2009

12/30/2009

12/29/2009

12/28/2009

等等。

7 个答案:

答案 0 :(得分:63)

我猜EventDate是char或varchar而不是日期,否则你的order by子句会没问题。

您可以使用CONVERT将值更改为日期并按该

排序
SELECT * 
FROM 
     vw_view 
ORDER BY 
   CONVERT(DateTime, EventDate,101)  DESC

问题在于,正如Sparky在评论中指出的那样,如果EventDate具有无法转换为日期的值,则查询将不会执行。

这意味着您应该排除坏行或让坏行转到结果的底部

要排除错误的行,只需添加WHERE IsDate(EventDate) = 1

即可

要让错误的日期到达底部,您需要使用CASE

e.g。

ORDER BY 
    CASE
       WHEN IsDate(EventDate) = 1 THEN CONVERT(DateTime, EventDate,101)
       ELSE null
    END DESC

答案 1 :(得分:19)

尝试:

ORDER BY MONTH(Date),DAY(DATE)

编辑(由匿名用户提供。)

我相信这篇文章已经完成了,但是上面的这个用户已经找到了解决我的问题的问题。

如果有人遇到其他解决方案的问题,请尝试使用上述代码的一小段内容。

ORDER BY YEAR(Date) DESC, MONTH(Date) DESC, DAY(DATE) DESC

这是我最后的方法,它在JET DB上完美运行。

PS。我希望没有人真正使用Date作为他们的字段名; - )

答案 2 :(得分:6)

字段中包含字段,因此您需要将其转换为日期时间

order by CONVERT(datetime, EventDate ) desc

答案 3 :(得分:4)

字段EventDate的类型是什么,因为排序不正确我假设您没有将其设置为某个日期/时间表示类型,而是字符串。然后美国人写日期的方式很难排序

答案 4 :(得分:3)

如果您将日期格式重新组织为YYYY / MM / DD,那么您可以使用这个简单的字符串排序来实现您需要的格式化。

或者,使用SUBSTR(store_name,start,length)命令,您应该能够将排序术语重组为上述格式

或许使用以下

SELECT     *
FROM         vw_view
ORDER BY SUBSTR(EventDate,6,4) + SUBSTR(EventDate, 0, 5) DESC

答案 5 :(得分:3)

假设您有权进行架构更改,这个问题唯一可接受的答案IMO是将基础数据类型更改为更合适的方式(例如,如果是SQL Server 2008,则为date。)

将日期存储为mm/dd/yyyy字符串是空间效率低下,难以正确验证并使排序和日期计算不必要地痛苦。

答案 6 :(得分:0)

试试这个

SELECT     *
FROM  vw_view
ORDER BY DATE_FORMAT(EventDate, "%m-%d-%y") DESC
相关问题