一尘不染

PostgreSQL查询中的日期列算术

sql

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

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 ...

                                                             ^

查询结果的第二列将显示一个日期,N days BEFORE该日期是表1中的日期,其中N是表2中的日期与表1中的日期之间的差(以天为单位)。

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

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

我正在使用PG 8.4。


阅读 151

收藏
2021-03-17

共1个答案

一尘不染

您将需要通过表修饰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);
  • 减去两个日期将得出整数。演员表是多余的。

  • 不要忽略列别名AS关键字-尽管通常可以省略表别名。手册:AS

您可以省略AS,但是仅当所需的输出名称与任何PostgreSQL关键字都不匹配时(请参阅附录C)。为了防止将来可能添加新的关键字,建议您始终AS对输出名称进行写或双引号。)

  • USING子句连接表仅在结果集中保留 一个 或多个连接列的实例(user_id在这种情况下),而您不必再对其进行表限定。
2021-03-17