【问题标题】:Date column arithmetic in PostgreSQL queryPostgreSQL 查询中的日期列算术
【发布时间】:2012-07-17 04:39:31
【问题描述】:

我有两个如下所示的表:

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 BEFOREtable1中的日期,其中N是table2中的日期与table1中的日期之间的差异(以天为单位)。

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

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

我正在使用 PG 8.4。

【问题讨论】:

  • 我在尝试执行 CREATE 查询时遇到不同的错误:ERROR: "user_id" is ambiguous LINE 6: CREATE TABLE foo AS SELECT user_id, (t1.the_date - (t2.the_d... ^ 编辑:在 user_id 查询之前添加 t1. 后工作正常。 PostgreSQL 8.4
  • @LisMorski:我已经更正了我给出的示例。这是一个错字。

标签: sql postgresql date-arithmetic


【解决方案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);
  • 两个日期相减得到整数。演员阵容是多余的。

  • 不要为 column aliases 省略 AS 关键字 - 虽然通常可以为表别名省略 ASThe manual:

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

  • 使用USING 子句连接表只会在结果集中保留一个 连接列的实例(在本例中为user_id),而您没有再对其进行表限定。

【讨论】:

  • 我发现了问题。事实证明,我使用的别名 start_date 与函数中的一个参数相同(错误消息中的 $1 应该提醒我!)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
相关资源
最近更新 更多