【问题标题】:Postgres: Ordering result by to_char date fieldPostgres:按 to_char 日期字段排序结果
【发布时间】:2014-01-29 01:00:28
【问题描述】:

这是我当前的查询:

SELECT SUM(round("records"."value")) AS sum_value, 
    to_char(service_date_time, 'Mon YYYY') AS to_char_service_date_time_mon_yyyy
FROM "records" 
INNER JOIN "categories" ON "categories"."id" = "records"."category_id" 
WHERE (value < 10000) 
AND (categories.kind = 'Attendance') 
AND (records.service_date_time >= '2013-01-01 00:00:00.000000' 
AND records.service_date_time <= '2014-01-29 00:37:00.400862') 
GROUP BY to_char_service_date_time_mon_yyyy

这会返回所有正确的数据:

3036710 Aug 2013
2792991 Jul 2013
3344243 Jun 2013
3121535 Apr 2013
3752803 Sep 2013
2931149 May 2013
3046820 Nov 2013
4437698 Mar 2013
2709170 Jan 2014
3709154 Jan 2013
3361630 Dec 2013
3008767 Oct 2013
3474820 Feb 2013

但是,我似乎无法按新的日期格式列排序,因为它是一个字符串。如果我这样做,它会先排序 2013 年 4 月,然后是 2013 年 8 月。我需要按月排序。我尝试了一些不同的方法,例如使用 to_date 而不是 to_char,还尝试在订购前将列转换为日期。没有骰子。

有什么想法吗?

谢谢!

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    我认为最简单的方法是:

    order by min(service_date_time)
    

    【讨论】:

    • 是的,这似乎更简单。
    【解决方案2】:

    您可以添加辅助列进行排序:

    SELECT SUM(round("records"."value")) AS sum_value, 
        to_char(service_date_time, 'Mon YYYY') AS to_char_service_date_time_mon_yyyy,
        max(to_char(service_date_time, 'yyyy-mm')) as yyyy_mm
    FROM "records" 
    INNER JOIN "categories" ON "categories"."id" = "records"."category_id" 
    WHERE (value < 10000) 
    AND (categories.kind = 'Attendance') 
    AND (records.service_date_time >= '2013-01-01 00:00:00.000000' 
    AND records.service_date_time <= '2014-01-29 00:37:00.400862') 
    GROUP BY to_char_service_date_time_mon_yyyy
    order by yyyy_mm
    

    如果要删除辅助列,那么:

    SELECT sum_value, to_char_service_date_time_mon_yyyy
    FROM (... copy the above query here...) t
    

    【讨论】:

    • 那是因为有group by。如果没有max,查询将不会运行。您知道yyyy_mm 的值在单个组内是相同的,您可以放心地应用max 函数。这是常见的技术。
    【解决方案3】:

    试试这个:

    SELECT x.sum_value, x.to_char_service_date_time_mon_yyyy
    FROM(
        SELECT SUM(round("records"."value")) AS sum_value, 
            to_char(service_date_time, 'Mon YYYY') AS to_char_service_date_time_mon_yyyy,
            to_char(service_date_time, 'Mon') AS month
        FROM "records" 
        INNER JOIN "categories" ON "categories"."id" = "records"."category_id" 
        WHERE (value < 10000) 
        AND (categories.kind = 'Attendance') 
        AND (records.service_date_time >= '2013-01-01 00:00:00.000000' 
        AND records.service_date_time <= '2014-01-29 00:37:00.400862') 
        GROUP BY to_char_service_date_time_mon_yyyy
        ORDER BY month) x
    

    这个想法是获取另一个带有月份的列并按其排序,您可以在子查询中执行此操作以避免在结果集中选择新列 month

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      相关资源
      最近更新 更多