按日期降序排列 - 月、日和年
Posted
技术标签:
【中文标题】按日期降序排列 - 月、日和年【英文标题】:Order by descending date - month, day and year 【发布时间】:2011-01-13 02:10:31 【问题描述】:这似乎很愚蠢,但我只需要一个日期列表,以最近的日期在顶部进行排序。使用 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
等等。
【问题讨论】:
EventDate
列的数据类型是什么?
DB的类型也不错
为什么不使用日期字段更新您的表格设计并使其正确?!对糟糕的设计使用变通方法并不是一条好路。
【参考方案1】:
我猜EventDate
是 char 或 varchar 而不是日期,否则您的 order by 子句就可以了。
您可以使用 CONVERT 将值更改为日期并按该日期排序
SELECT *
FROM
vw_view
ORDER BY
CONVERT(DateTime, EventDate,101) DESC
问题在于,正如 Sparky 在 cmets 中指出的那样,如果 EventDate 的值无法转换为查询不会执行的日期。
这意味着您应该排除坏行或让坏行放在结果的底部
要排除坏行,只需添加WHERE IsDate(EventDate) = 1
要让糟糕的日期浮出水面,您需要使用CASE
例如
ORDER BY
CASE
WHEN IsDate(EventDate) = 1 THEN CONVERT(DateTime, EventDate,101)
ELSE null
END DESC
【讨论】:
这很好用,谢谢!您假设它是 sql server 并且 EventDate 设置为 varchar 是正确的 @user570457。没问题。我更新了您的标签以包含 SQL-Server。将其包含在下一个问题中是个好主意。 一个警告,如果任何日期无效,SQL 将在转换时返回错误,使您的查询无效。可能会令人沮丧,因为您必须找出导致问题的日期。您可以使用 IsDate() =0 查看是否有任何无效日期需要担心【参考方案2】:试试ORDER BY MONTH(Date),DAY(DATE)
试试这个:
ORDER BY YEAR(Date) DESC, MONTH(Date) DESC, DAY(DATE) DESC
在 JET DB 上完美运行。
【讨论】:
【参考方案3】:你有一个字符串中的字段,所以你需要将它转换为日期时间
order by CONVERT(datetime, EventDate ) desc
【讨论】:
【参考方案4】:假设您有权更改架构,IMO 对这个问题的唯一可接受的答案是将基本数据类型更改为更合适的类型(例如,date
如果 SQL Server 2008)。
将日期存储为 mm/dd/yyyy
字符串空间效率低下,难以正确验证,并且使排序和日期计算不必要地痛苦。
【讨论】:
【参考方案5】:字段EventDate
的类型是什么,因为排序不正确,我假设您没有将它设置为某个日期/时间表示类型,而是一个字符串。然后美国人写日期的方式很讨厌
【讨论】:
无论出于什么原因,设置它的人都将 EventDate 设置为 varchar:/【参考方案6】:如果您将日期格式重组为 YYYY/MM/DD,那么您可以使用这个简单的字符串排序来实现您需要的格式。
或者,使用SUBSTR(store_name,start,length) 命令,您应该能够将排序术语重组为上述格式
也许使用以下
SELECT *
FROM vw_view
ORDER BY SUBSTR(EventDate,6,4) + SUBSTR(EventDate, 0, 5) DESC
【讨论】:
【参考方案7】:试试这个
SELECT *
FROM vw_view
ORDER BY DATE_FORMAT(EventDate, "%m-%d-%y") DESC
【讨论】:
以上是关于按日期降序排列 - 月、日和年的主要内容,如果未能解决你的问题,请参考以下文章
使用 VueFire,我如何按日期降序排列我的列表(从最新到最旧)?