PostgreSQL查询中的日期列算法

时间:2012-07-18 07:31:54

标签: sql postgresql date-arithmetic

我有两个看起来像这样的表:

CREATE TABLE table1 (user_id int, the_date date);
CREATE TABLE table2 (user_id int, the_date date, something_else real);

我正在编写一个看起来像这样的查询

CREATE TABLE foo AS 
 SELECT t1.user_id
 , (t1.the_date - (t2.the_date - t1.the_date)::int) start_date
 FROM table1 t1, table2 t2 
 where t1.user_id=t2.user_id
 ;

当我运行上述查询时,我在psql控制台上显示以下错误:

ERROR:  syntax error at or near "$1"
LINE 1: ...the_date - (t2.the_date - t1.the_date)::int)  $1 ...

                                                             ^

查询结果中的第二列是显示table1中日期N days BEFORE的日期,其中N是table2和table1中日期之间的差异(以天为单位)。

注意:table2的日期总是晚于table1中的日期。

如何执行此日期计算并将结果存储为查询中的新列别名?

我正在使用PG 8.4。

1 个答案:

答案 0 :(得分:2)

作为@LisMorski commented,您需要对t1.user_id进行表格限定,以消除您拥有它的方式。

我还建议进行其他一些调整:

CREATE TABLE foo AS 
 SELECT user_id
       ,(t1.the_date - (t2.the_date - t1.the_date)) AS start_date
 FROM table1 t1
 JOIN table2 t2 USING (user_id);
  • 减去两个日期会产生整数。演员是多余的。

  • 对于column aliases,最好使用AS关键字(虽然通常可以省略表别名)。我引用手册here

  

您可以省略AS,但仅限于所需的输出名称不匹配   任何PostgreSQL关键字(see Appendix C)。为了防范   可能的未来关键字添加,建议您始终   写入AS或双引号输出名称。)

  • 如果您使用明确的JOIN子句加入表格,使用USING关键字,那么结果集中只有一列user_id,您不必再对其进行表限定。