从时间戳日期减去1天

J-K*_*-Ko 51 sql postgresql casting

我正在使用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
Run Code Online (Sandbox Code Playgroud)

((date_at)-1)第1行的条款导致:

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

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

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

类型转换的在线指南非常无益.感谢投入.

Mic*_*zzi 119

使用INTERVAL它的类型.例如:

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

--Unrelated to the question, but PostgreSQL also supports some shortcuts:
SELECT 'yesterday'::TIMESTAMP, 'tomorrow'::TIMESTAMP, 'allballs'::TIME;
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

补充提示

您可以附加多个操作数.例如:如何获得当月的最后一天?

SELECT date_trunc('MONTH', CURRENT_DATE) + INTERVAL '1 MONTH - 1 DAY';
Run Code Online (Sandbox Code Playgroud)

更多信息在这里这里.

  • 对于那些想知道的人来说,“allballs”字面意思是午夜,因为它看起来像 00:00:00。 (13认同)
  • 另一个提示:如果您已将天数存储在数据库列中(假设为 num_of_days),则可以使用 `SELECT NOW() - INTERVAL '1 DAY' * num_of_days`; (9认同)

GG.*_*GG. 21

您可以将 a 转换TIMESTAMP为 a DATE,这样您就可以从中减去 an INTEGER

例如,要获取昨天:

now()::DATE - 1
Run Code Online (Sandbox Code Playgroud)

所以你的查询将变成:

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
Run Code Online (Sandbox Code Playgroud)