2016-11-11 47 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'(加號)。但它應該是正確的。

相關問題