2016-11-11 48 views
2
     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' 

回答

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) 
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子句中使用任何功能上的“时间戳”,索引可能更容易被用来加快查询(前提当然还有是“时间戳”列中的索引)。

但我必须承认时区总是让我困惑。为什么当我要换算到香港时间时,我用日期文字和“GMT-8”(减号)来谈论香港时,它是'+08'(加号)。但它应该是正确的。

相关问题