从计算的间隔中提取天数

时间:2014-01-29 19:10:52

标签: postgresql

我正在尝试使用以下查询来运行:

SELECT EXTRACT(DAY FROM INTERVAL to_date - from_date) FROM histories;

在引用的表中,to_date和from_date的类型为timestamp,不带时区。像

这样的常规查询
SELECT to_date - from_date FROM histories;

给出区间结果,例如'65天04:58:09.99'。但是在第一个查询中使用此表达式会给出错误:类型interval的输入语法无效。我尝试了各种引用,甚至没有运气地嵌套查询。可以这样做吗?

2 个答案:

答案 0 :(得分:1)

  

SELECT EXTRACT(来自INTERVAL的日期to_date - from_date)FROM历史;

这没有任何意义。 INTERVAL xxx是区间文字的语法。因此INTERVAL from_date是语法错误,因为from_date不是文字。如果您的代码看起来更像INTERVAL '2012-02-01',那么这将失败,因为2012-02-01不是INTERVAL的有效语法。

此处的INTERVAL关键字只是噪音。我怀疑你误解了文档中的一个例子。删除它,表达式就可以了。

我猜你试图将两个日期之间的天数表示为timestamptimestamptz

如果是这样的话,要么同时进行投射:

SELECT to_date::date - from_date::date FROM histories;

或获取间隔,然后提取日期组件:

SELECT extract(day from to_date - from_date) FROM histories;

答案 1 :(得分:0)

此示例使用触发器删除了创建表的行为,该触发器更新了DDD HH24:MI:SS格式的stop_time和start_time之间的差,其中DDD代表日期量...

DROP TABLE IF EXISTS benchmarks ;

  SELECT 'create the "benchmarks" table'
  ;
     CREATE TABLE benchmarks (
        guid           UUID NOT NULL DEFAULT gen_random_uuid()
      , id             bigint UNIQUE NOT NULL DEFAULT cast (to_char(current_timestamp, 'YYMMDDHH12MISS') as bigint)
      , git_hash                char (8) NULL DEFAULT 'hash...'
      , start_time              timestamp NOT NULL DEFAULT DATE_TRUNC('second', NOW())
      , stop_time               timestamp NOT NULL DEFAULT DATE_TRUNC('second', NOW())
      , diff_time               varchar (20) NOT NULL DEFAULT 'HH:MI:SS'
      , update_time             timestamp DEFAULT DATE_TRUNC('second', NOW())
      , CONSTRAINT pk_benchmarks_guid PRIMARY KEY (guid)
      ) WITH (
        OIDS=FALSE
      );

  create unique index idx_uniq_benchmarks_id on benchmarks (id);

-- START trigger trg_benchmarks_upsrt_diff_time
-- hrt = human readable time
CREATE OR REPLACE FUNCTION fnc_benchmarks_upsrt_diff_time()

    RETURNS TRIGGER
    AS $$
       BEGIN
          -- NEW.diff_time = age(NEW.stop_time::timestamp-NEW.start_time::timestamp);
          NEW.diff_time = to_char(NEW.stop_time-NEW.start_time, 'DDD HH24:MI:SS');
          RETURN NEW;
       END;
    $$ LANGUAGE plpgsql;


 CREATE TRIGGER trg_benchmarks_upsrt_diff_time
  BEFORE INSERT OR UPDATE ON benchmarks
  FOR EACH ROW EXECUTE PROCEDURE fnc_benchmarks_upsrt_diff_time();
--
-- STOP trigger trg_benchmarks_upsrt_diff_time