从时间戳记日期减去1天


105

我正在使用Datagrip for Postgresql。我有一个带有时间戳格式的日期字段的表(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

((date_at)-1)第1行上的子句导致:

[42883]错误:运算符不存在:没有时区的时间戳-整数提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。位置:69

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

[42883]错误:运算符不存在:带时区的时间戳-整数提示:没有运算符与给定的名称和参数类型匹配。您可能需要添加显式类型转换。位置:...

类型转换的在线指南完全没有帮助。输入表示赞赏。

Answers:


239

使用INTERVAL它的类型。例如:

--yesterday
SELECT NOW() - INTERVAL '1 DAY';

--Unrelated to the question, but PostgreSQL also supports some shortcuts:
SELECT 'yesterday'::TIMESTAMP, 'tomorrow'::TIMESTAMP, 'allballs'::TIME;

然后,您可以对查询执行以下操作:

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);


更多信息:

日期/时间函数和运算符

datatype-datetime(特殊值)


2
对于那些想知道的人,“ allballs”是午夜的字面意思,因为它看起来像是00:00:00。
WIM
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.