按月,然后按年排序数据

时间:2016-11-11 07:43:49

标签: sql postgresql

                        Table Folder

      Column       |           Type           |                              Modifiers                          
-------------------+--------------------------+---------------------------------
 ID                | integer                  | not null default 
 Name              | character varying        | not null
 Size              | bigint                   | not null
 Timestamp         | timestamp with time zone | 

尝试计算2014年上传的所有文件。同年的每月计数。

SELECT COUNT(*) FROM  "File" WHERE "Timestamp" >  '2014-01-01 21:53:23+08'

2 个答案:

答案 0 :(得分:0)

SELECT TO_CHAR(Timestamp, 'Mon') AS month,
       COUNT(*) AS fileCount
FROM File
WHERE EXTRACT(YEAR FROM Timestamp) = 2014
GROUP BY TO_CHAR(Timestamp, 'Mon')

如果您想要一份显示多年的月度细分的报告,那么您可以稍微修改上述查询:

SELECT TO_CHAR(Timestamp, 'Mon') AS month,
       EXTRACT(YEAR FROM Timestamp) AS year,
       COUNT(*) AS fileCount
FROM File
WHERE EXTRACT(YEAR FROM Timestamp) IN (2014, 2015, ...)
GROUP BY TO_CHAR(Timestamp, 'Mon'),
         EXTRACT(YEAR FROM Timestamp)

答案 1 :(得分:0)

看到您自己的查询,您似乎想要考虑从时区GMT + 8小时(新加坡,香港或其他)看到的2014年时间戳并相应计算。我认为查询应该是:

SELECT EXTRACT(MONTH FROM "Timestamp" AT TIMEZONE 'GMT-8'), COUNT(*)
FROM "File"
WHERE "Timestamp" >= timestamp with timezone '2014-01-01 00:00:00+08'
  AND "Timestamp" <  timestamp with timezone '2015-01-01 00:00:00+08'
GROUP BY EXTRACT(MONTH FROM "Timestamp" AT TIMEZONE 'GMT-8')
ORDER BY EXTRACT(MONTH FROM "Timestamp" AT TIMEZONE 'GMT-8');

由于我没有在where子句中使用“Timestamp”上的任何函数,因此索引可能更有可能用于加速查询(前提是 是一个索引“时间戳“列”。

但我必须承认时区总是让我困惑。当我想谈到香港的日期时间文字和'GMT-8'(减号),当我想转换到香港时间时,为什么它是'+ 08'(加号)?不过,它应该是正确的。