我正在尝试使用以下查询来运行:
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的输入语法无效。我尝试了各种引用,甚至没有运气地嵌套查询。可以这样做吗?
答案 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
关键字只是噪音。我怀疑你误解了文档中的一个例子。删除它,表达式就可以了。
我猜你试图将两个日期之间的天数表示为timestamp
或timestamptz
。
如果是这样的话,要么同时进行投射:
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