PostgreSQL 教程: date_trunc 函数

九月 18, 2023

摘要:本教程向您展示如何使用 PostgreSQL 的date_trunc()函数,将时间戳或间隔值截断到指定的精度级别。

目录

PostgreSQL date_trunc 函数简介

date_trunc函数根据指定的日期部分(例如小时、周或月)截断一个 TIMESTAMP 或一个 INTERVAL 值,并以一定精度返回截断的时间戳或间隔值。

下面说明了date_trunc函数的语法:

date_trunc('datepart', field)

datepart参数是用于截断field的精度级别,可以是以下之一:

  • millennium
  • century
  • decade
  • year
  • quarter
  • month
  • week
  • day
  • hour
  • minute
  • second
  • milliseconds
  • microseconds

field参数是一个要截断的TIMESTAMPINTERVAL值。它可以是计算结果为时间戳或间隔值的表达式。

date_trunc函数返回一个TIMESTAMPINTERVAL值。

PostgreSQL date_trunc 示例

以下示例将TIMESTAMP值截断到hour日期部分:

SELECT DATE_TRUNC('hour', TIMESTAMP '2017-03-17 02:09:30');

以下是输出:

     date_trunc
---------------------
 2017-03-17 02:00:00
(1 row)

date_trunc函数返回具有小时精度的结果。

如果要将TIMESTAMP值截断到分钟,可以将'minute'字符串作为第一个参数传递:

SELECT date_trunc('minute', TIMESTAMP '2017-03-17 02:09:30');

该函数返回一个精度级别为分钟的TIMESTAMP值:

 date_trunc
---------------------
 2017-03-17 02:09:00
(1 row)

请查看示例数据库中的rental表,如下:

Rental table - PostgreSQL date_trunc function demo

您可以使用date_trunc函数按月统计租赁次数,如下:

SELECT
    date_trunc('month', rental_date) m,
    COUNT (rental_id)
FROM
    rental
GROUP BY
    m
ORDER BY
    m;

在此查询中,date_trunc函数将租赁日期截断到月份部分。COUNT 函数计算租赁数量,并使用 GROUP BY 子句按月对租赁进行分组。

        month        | count
---------------------+-------
 2005-05-01 00:00:00 |  1156
 2005-06-01 00:00:00 |  2311
 2005-07-01 00:00:00 |  6709
 2005-08-01 00:00:00 |  5686
 2006-02-01 00:00:00 |   182
(5 rows)

同样,您可以按如下方式计算员工每年的租赁次数:

SELECT
	staff_id,
	date_trunc('year', rental_date) y,
	COUNT (rental_id) rental
FROM
	rental
GROUP BY
	staff_id, y
ORDER BY
	staff_id

下面显示了输出:

 staff_id |          y          | rental
----------+---------------------+--------
        1 | 2006-01-01 00:00:00 |     85
        1 | 2005-01-01 00:00:00 |   7955
        2 | 2005-01-01 00:00:00 |   7907
        2 | 2006-01-01 00:00:00 |     97
(4 rows)

在本教程中,您学习了如何使用 PostgreSQL 的date_trunc函数截断时间戳或间隔值。

了解更多

PostgreSQL 教程:日期函数

PostgreSQL 文档:时间/日期函数和操作符