【问题标题】:Sorting of dates in order of date and then month such that records are sorted by date first and then by month按日期和月份的顺序对日期进行排序,以便记录先按日期排序,然后按月份排序
【发布时间】:2017-05-26 03:06:01
【问题描述】:

谁能帮我按预期排序记录(Postgres 数据库)?

以下是对我的一张表的查询结果,我已按整个日期的日期部分排序 (ORDER BY extract(DAY from cast(date as DATE)))

注意:: 所有日期均采用 YYYY-MM-DD 格式

2016-03-01
2016-09-01
2016-08-01
2016-12-01
2016-01-01
2016-07-01
2016-11-01
2016-02-01
2016-06-01
2016-10-01
2016-04-01
2016-05-01
2016-07-22
2016-08-22
2016-10-22
2016-09-22
2016-11-22
2016-12-22

这很好,因为它根据日期部分对记录进行排序。但是,我想要的是,结果应该是所有记录都应该根据日期部分排序,所以日期 1 的所有记录都在日期 22 的所有记录之前,而且它应该对这两个部分进行排序,即日期 1 和日期 22 也按月份部分(如果查看上面的结果集,您会注意到它是按日期部分排序的,而不是按月份部分排序的)。所以基本上我想要的结果应该如下所示

2016-01-01
2016-02-01
2016-03-01
2016-04-01
2016-05-01
2016-06-01
2016-07-01
2016-08-01
2016-09-01
2016-10-01
2016-11-01
2016-12-01
2016-07-22
2016-08-22
2016-09-22
2016-10-22
2016-11-22
2016-12-22

【问题讨论】:

  • 除了 1 号和 22 号之外,你还有其他日子吗?
  • 是的,我会的。但是您遵循的解决方案似乎有效ORDER BY extract(DAY from cast(date as DATE)), date

标签: sql postgresql sorting datetime


【解决方案1】:

使用两步排序,只需在每个天块内添加另一个排序:

ORDER BY extract(DAY from cast(date as DATE)),      -- first sort by day
         date                                       -- then sort by date

此排序将第 1 天的记录放在首位,其他(即第 22 天)的记录放在最后。在每个 1/22 日期块内,记录按日期升序排列。

【讨论】:

  • 嘿@Tim Biegeleisen,感谢您的解决方案。我很快就用 CASE 语句厌倦了你的第一个解决方案,它适用于当前的结果集。但我担心的是它是否会在日期不是 1 和 22 时起作用
猜你喜欢
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
相关资源
最近更新 更多