从时间戳日期减去1天

时间:2017-09-06 16:03:39

标签: sql postgresql casting

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

  1. 应用数学运算符减去1天
  2. 根据今天的时间窗口 - 130天过滤它
  3. 显示没有印章的hh / mm / ss部分(2016-10-31)
  4. 当前开始查询:

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

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

      

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

    输入类型广告的在线指南非常无益。感谢投入。

2 个答案:

答案 0 :(得分:82)

使用INTERVAL类型。 E.g:

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

附加提示¹

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

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

附加提示²

您还可以使用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);

更多信息herehere

答案 1 :(得分:3)

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

例如,获取昨天:

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