按降序排序 - 月,日和年

use*_*457 45 sql sql-server

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

SELECT     *
FROM         vw_view
ORDER BY EventDate DESC
Run Code Online (Sandbox Code Playgroud)

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

12/31/2009 

12/31/2008

12/30/2009

12/29/2009
Run Code Online (Sandbox Code Playgroud)

需要更像:

12/31/2009

12/30/2009

12/29/2009

12/28/2009
Run Code Online (Sandbox Code Playgroud)

等等.

Con*_*rix 63

我猜EventDate是char或varchar,而不是日期,否则你的order by子句会好的.

您可以使用CONVERT将值更改为日期并按此排序

SELECT * 
FROM 
     vw_view 
ORDER BY 
   CONVERT(DateTime, EventDate,101)  DESC
Run Code Online (Sandbox Code Playgroud)

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

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

要排除坏行,只需添加即可 WHERE IsDate(EventDate) = 1

要让坏日期到底,你需要使用 CASE

例如

ORDER BY 
    CASE
       WHEN IsDate(EventDate) = 1 THEN CONVERT(DateTime, EventDate,101)
       ELSE null
    END DESC
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的是,如果任何日期无效,SQL将在转换时返回错误,使您的查询无效.可能令人沮丧,因为你必须弄清楚导致问题的日期.您可以使用IsDate()= 0来查看是否有任何无效日期需要担心 (3认同)

小智 19

尝试:

__PRE__

编辑(由匿名用户.)

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

如果有人遇到其他解决方案的问题,请尝试上面代码的一个小模块.

__PRE__

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

PS.我希望没有人真正使用ORDER BY MONTH(Date),DAY(DATE)他们的字段名;-)


Jas*_*ong 6

您在字符串中有字段,因此您需要将其转换为日期时间

order by CONVERT(datetime, EventDate ) desc
Run Code Online (Sandbox Code Playgroud)


Mar*_*ith 6

假设您有能力更改架构,对于这个问题,IMO 唯一可接受的答案是将基本数据类型更改为更合适的类型(例如,date如果是 SQL Server 2008)。

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