我正在为 Postgresql 使用 Datagrip。我有一个带有时间戳格式的日期字段的表(ex: 2016-11-01 00:00:00)。我希望能够:
(ex: 2016-11-01 00:00:00)
当前开始查询:
select org_id, count(accounts) as count, ((date_at) - 1) as dateat from sourcetable where date_at <= now() - 130 group by org_id, dateat
第 1 行的((date_at)-1)子句导致:
((date_at)-1)
[42883] 错误:运算符不存在:没有时区的时间戳 - 整数 提示:没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。职位:69
该now()子句产生了类似的信息:
now()
[42883] 错误:运算符不存在:带时区的时间戳 - 整数 提示:没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。位置: …
类型转换的在线指南非常无用。输入表示赞赏。
使用INTERVAL它的类型。例如:
INTERVAL
--yesterday SELECT NOW() - INTERVAL '1 DAY'; --Unrelated: PostgreSQL also supports some interesting shortcuts: SELECT 'yesterday'::TIMESTAMP, 'tomorrow'::TIMESTAMP, 'allballs'::TIME AS aka_midnight;
然后您可以执行以下操作:
SELECT org_id, count(accounts) AS COUNT, ((date_at) - INTERVAL '1 DAY') AS dateat FROM sourcetable WHERE date_at <= now() - INTERVAL '130 DAYS' GROUP BY org_id, dateat;
您可以附加多个操作数。 例如:如何获得当月的最后一天?
SELECT date_trunc('MONTH', CURRENT_DATE) + INTERVAL '1 MONTH - 1 DAY';
您还可以使用make_interval函数创建一个间隔,当您需要在运行时创建它时很有用(不使用文字):
make_interval
SELECT make_interval(days => 10 + 2); SELECT make_interval(days => 1, hours => 2); SELECT make_interval(0, 1, 0, 5, 0, 0, 0.0);
日期/时间函数和运算符
数据类型-日期时间(特殊值)。