自定义DATE_TRUNC时间范围

时间:2019-07-26 19:29:16

标签: sql postgresql

我正在尝试在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

但是我不想改变时间戳,而且不确定如何修改时间戳以实现我上面想要的功能。

3 个答案:

答案 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。但是您可以放心危险。