2016-11-11 6 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句に「タイムスタンプ」に任意の関数を使用していないため、インデックスがより多くの可能性があり、もちろん提供(クエリをスピードアップするために使用することができるは「タイムスタンプ」列のインデックスです)。

しかし、私はタイムゾーンが常に私を混乱させることを認めなければなりません。なぜ私は日時リテラルで香港について話すと '+08'(プラス記号)、香港時間に変換したいときには 'GMT-8'(マイナス記号)ですか?しかし、正しいはずです。

関連する問題