SQL:从时间戳日期减去1天

我在Postgresql中使用Datagrip。我有一个表的日期字段在时间戳格式(ex: 2016-11-01 00:00:00)。我希望能够:

  1. 应用数学运算减去1天
  2. 根据今天的时间窗口(130天)进行筛选
  3. 显示时不包含邮票的hh/mm/ss部分(2016-10-31)

当前起始查询:

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)子句导致:

[42883] ERROR: operator does not exist: timestamp without time zone - 提示:没有匹配给定名称和参数类型的操作符。 您可能需要添加显式类型强制转换。位置:69 < / p >

now()子句产生类似的消息:

[42883] ERROR: operator does not exist: timestamp with time zone - 提示:没有匹配给定名称和参数类型的操作符。 您可能需要添加显式类型强制转换。位置:…< / p >

关于类型转换的在线指南毫无帮助。欢迎输入。

320750 次浏览

对其使用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;

提示

技巧1

可以追加多个操作数。例:如何得到当月的最后一天?

SELECT date_trunc('MONTH', CURRENT_DATE) + INTERVAL '1 MONTH - 1 DAY';

技巧2

你也可以使用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);

更多信息:

日期/时间函数和操作符

dattype -datetime(特殊值)

可以将TIMESTAMP类型转换为DATE类型,这样可以从中减去INTEGER类型。

例如,to get yesterday:

now()::DATE - 1

所以你的问题会变成:

SELECT org_id, date_at::DATE - 1 AS dateat, COUNT(accounts) AS count
FROM sourcetable
WHERE date_at <= NOW()::DATE - 130
GROUP BY 1, 2