我正在尝试在DATE_TRUNC函数中自定义时间范围,因此不是典型的
copyObj: function (src) {
return Object.assign({}, src);
}
理想情况下,我想要
DATE_TRUNC('hour', user.created_at)
但是那当然不是有效的时区单位,所以我会收到类似
的错误DATE_TRUNC('3 hours', user.created_at)
我知道我可以修改
这样的CASE语句ERROR: timestamp with time zone units "3 hour" not recognized
********** Error **********
ERROR: timestamp with time zone units "3 hour" not recognized
SQL state: 22023
但是我不想改变时间戳,而且不确定如何修改时间戳以实现我上面想要的功能。
答案 0 :(得分:0)
您可以这样做:
date_trunc('hour', user.created_at) + interval '3 hour'
您想要得到什么结果?您说过您不想改变时间戳,那么您想要带“ 3小时”返回的是什么?
答案 1 :(得分:0)
有些痛苦,但是您可以:
select (date_trunc('day', user.created_at) +
floor(extract(hour from user.created_at) / 3) * interval '3 hour'
)
答案 2 :(得分:0)
我不确定我是否完全理解您的“ DATE_TRUNC('3 hours',user.created_at)”,但是好像从午夜返回了一些时间间隔。因此,我将继续该假设。
内置的date_trunc函数定义为采用2个参数,即text和timestamp(实际上对于带时区的时间戳和不带时区的时间戳实际上已重载)。您可以扩展此重载概念,并在重载中使用间隔而不是文本。”因此
create or replace function date_trunc (intv interval, ts timestamp without time zone)
returns timestamp without time zone
language sql immutable leakproof
as $$
select date_trunc('day', ts) + intv;
$$;
create or replace function date_trunc (intv interval, ts timestamp with time zone)
returns timestamp with time zone
language sql immutable leakproof
as $$
select date_trunc('day', ts) + intv;
$$;
-- Test
select date_trunc('3 hours'::interval, now()) with_ts
, date_trunc('3 hours'::interval, now()::timestamp without time zone) without_ts;
但是,我不喜欢重新定义内置函数,当以后出现问题时会引起很多混乱。因此,我将创建一个新的用户定义函数名称,而不是重载内置函数。如Date_Trunc_To_Interval。但是您可以放心危险。