date_bin()

将时间戳转换为最近指定间隔开始的函数

date_bin() 是一个系统函数,用于将任意时间戳强制转换为最近指定间隔的开始。例如,出于计划目的,可能需要确定时间戳关联的小时内的哪个特定 15 分钟间隔。

date_bin()PostgreSQL 14 中添加。

用法

date_bin (stride INTERVAL, source TIMESTAMP, origin TIMESTAMP) → TIMESTAMP
date_bin (stride INTERVAL, source TIMESTAMP WITH TIME ZONE, origin TIMESTAMP WITH TIME ZONE) → TIMESTAMP WITH TIME ZONE

变更历史

在 PostgreSQL 13 及更早版本中模拟 date_bin()

以下函数应提供与 PostgreSQL 13 及更早版本中的 date_bin() 等效的功能。

CREATE OR REPLACE FUNCTION date_bin (
  stride INTERVAL,
  source_ts TIMESTAMPTZ,
  base_ts TIMESTAMPTZ)
RETURNS TIMESTAMPTZ
LANGUAGE SQL
IMMUTABLE
AS $$
SELECT
  base_ts
  + FLOOR(EXTRACT(epoch FROM source_ts - base_ts) / EXTRACT(epoch FROM stride))::BIGINT
  * stride;
$$;

示例

date_bin() 的基本用法示例

postgres=# SELECT NOW(), date_bin('10 minutes', NOW(), '2001-01-01');
              now              |        date_bin        
-------------------------------+------------------------
 2021-03-25 17:25:56.817198+02 | 2021-03-25 17:20:00+02
(1 row)

这里,时间 17:25:56.817198+02 已“向下舍入”到最近的常规 10 分钟标记,即:2021-03-25 17:20:00+02

如果作为第三个参数提供的时间戳(“原点”)晚于输入时间戳,则返回的时间戳将“向上舍入”。

postgres=# SELECT now(), date_bin('10 minutes', now(), '2999-01-01');
              now              |        date_bin        
-------------------------------+------------------------
 2021-03-25 18:30:16.082261+02 | 2021-03-25 18:40:00+02
(1 row)

如果它包含特定时间,则该时间将用作返回时间戳的偏移量,例如:

postgres=# SELECT now(), date_bin('10 minutes', now(), '1999-01-01 00:05:00');
             now              |        date_bin        
------------------------------+------------------------
 2021-03-25 18:32:09.61745+02 | 2021-03-25 18:25:00+02
(1 row)

无法使用月或年作为间隔。

postgres=# SELECT date_bin('10 years', '2021-01-01', '2001-01-01');
ERROR:  timestamps cannot be binned into intervals containing months or years

分类

日期和时间系统函数

另请参阅

date_trunc()

反馈

提交关于 "date_bin()" 的任何评论、建议或更正 此处