2016-09-21 102 views
0

我有一個查詢,拉我需要跟蹤的部分數據。我需要添加的是包含日期或查詢日期範圍表的功能的列。如果可能,我寧願選擇列。我正在使用psql 8.3.3。包括時間範圍Postgres查詢

下面是當前查詢:

select count(mailing.mailing_id) as mailing_count, department.name as org 
from mailing, department 
where mailing.department_id = department.department_id 
group by department.name; 

這將返回以下信息:

mailing_count |     org     
---------------+----------------------------------------- 
      2 | org1 name 
      8 | org2 name 
      22 | org3 name 
      21 | org4 name 
      39 | org5 name 

,我查詢有3列有日期的時間戳格式爲target_launch_date表, created_timemodified_time

當我嘗試的日期範圍內添加到查詢我得到一個錯誤:

查詢:

select count(mailing.mailing_id) as mailing_count, department.name as org 
from mailing, department 
where mailing.department_id = department.department_id 
group by department.name, 
WHERE (target_launch_date)>= 2016-09-01 AND < 2016-09-05; 

錯誤:

ERROR: syntax error at or near "WHERE" LINE 1: ...department.department_id group by department.name,WHERE(targ...

我試着移動字符串中的日期範圍的位置以及其他各種更改,但無法實現我正在查找的內容河

任何有識之士將不勝感激!

回答

0

這裏有一個查詢,會做你需要的東西:

SELECT 
    count(m.mailing_id) as mailing_count, 
    d.name as org 
FROM mailing m 
JOIN department d USING(department_id) 
WHERE 
    m.target_launch_date BETWEEN '2016-09-01' AND '2016-09-05' 
GROUP BY 2 

由於您target_launch_date是類型timestamp你可以放心地做<= '2016-09-05'這實際上將轉化爲2016-09-05 00:00:00.00000給大家,是該開始前的日期如附加註釋一天或精確2016-09-05 00:00:00.00000

夫婦:

  • 使用表名縮短代碼的別名,例如。 mailing m
  • 使用明確JOIN語法將數據從相關表連接
  • 應用您WHERE子句前GROUP BY排除不符合它
  • 使用BETWEEN運營商來處理date >= X AND date <= Y當行
  • 您可以使用USING代替當連接列名相同時,在JOIN語法中ON
  • 您可以使用GROUP BY中指向列表中列位置的列號

要更深入地瞭解SELECT語句在步驟中的處理方式,請參閱documentation

編輯

使用BETWEEN運營商將佔2015-09-05 00:00:00.00000到結果集方法。如果這個時間戳應該被丟棄的變化BETWEEN x AND y到這類二:

  • (...) BETWEEN x AND y::timestamp - INTERVAL '1 microsecond'
  • (...) >= x AND (...) < y
+0

原來的問題是使用範圍形式'date> = X和日期 donkopotamus

+0

我認爲它會是<'2016/09/05',否則它可能會選擇'2016/09/05'中的項目,否?恕我直言,運營商之間不應該用於可能有時間分量的範圍(什麼是上限?)。 –

+0

不,他們不會被丟棄。它說它們會在哪裏? –

0

你被關閉,你需要對其中第二部分提供列名也和你將有一個單一的,其中:

select count(mailing.mailing_id) as mailing_count, department.name as org 
    from mailing 
    inner join department on mailing.department_id = department.department_id 
    where target_launch_date >= '2016-09-01' 
    AND target_launch_date < '2016-09-05' 
    group by department.name; 

編輯:這部分僅僅是卡米爾G.清楚地表明之間應不能使用:

create table sample (id int, d timestamp); 

insert into sample (id, d) 
values 
(1, '2016/09/01'), 
(2, '2016/09/02'), 
(3, '2016/09/03'), 
(4, '2016/09/04'), 
(5, '2016/09/05'), 
(6, '2016/09/05 00:00:00'), 
(7, '2016/09/05 00:00:01'), 
(8, '2016/09/06'); 

select * from sample where d between '2016-09-01' and '2016-09-05'; 

結果:

1;"2016-09-01 00:00:00" 
2;"2016-09-02 00:00:00" 
3;"2016-09-03 00:00:00" 
4;"2016-09-04 00:00:00" 
5;"2016-09-05 00:00:00" 
6;"2016-09-05 00:00:00" 

BTW,如果你不相信,沒有看到解釋,那麼這就是:

Filter: ((d >= '2016-09-01 00:00:00'::timestamp without time zone) AND (d <= '2016-09-05 00:00:00'::timestamp without time zone))