分享至

简介

在数据库中存储日期值的能力使您能够为数据的查询和分析添加时间元素。了解如何在各自的数据库中使用日期类型非常重要,这样您才能准确地报告订单信息、人员年龄或任何其他用例。

在本指南中,我们将讨论在 PostgreSQL 中存储 DATE 类型以及使用它们的各种方法。

PostgreSQL DATE 数据类型

DATE 类型在 PostgreSQL 中 可以存储不带关联时间值的日期

DATE

PostgreSQL 使用 4 个字节来存储日期值。PostgreSQL 中日期值的范围是公元前 4713 年到公元 5874897 年。

存储日期值时,PostgreSQL 使用 yyyy-mm-dd 格式,例如 1994-10-27。此格式也用于 PostgreSQL 中的 插入数据

在 PostgreSQL 中,可以设置当前日期的默认日期值。这可以在创建表时通过使用 DEFAULTCURRENT_DATE 关键字来完成。我们图书馆借阅表的 last_checkout 列默认接受当前日期

CREATE TABLE checkouts (
author_id serial PRIMARY KEY,
author_name VARCHAR (255) NOT NULL,
book_title VARCHAR (255) NOT NULL,
published_date DATE NOT NULL,
last_checkout DATE NOT NULL DEFAULT CURRENT_DATE
);

按照此表结构,我们可以使用 INSERT INTO 语句插入数据

INSERT INTO checkouts (author_name, book_title, published_date)
VALUES('James Joyce', 'Ulysses', '1922-02-02');

然后,当查询 checkouts 表时,我们得到以下结果

SELECT * FROM checkouts;
author_id | author_name | book_title | published_date | last_checkout
-----------+-------------+------------+----------------+---------------
1 | James Joyce | Ulysses | 1922-02-02 | 2021-09-27
(1 row)

PostgreSQL DATE 函数

通过了解 PostgreSQL 中 DATE 类型的来龙去脉,您可以使用函数来处理您存储的信息。我们将逐步介绍一些基于上一节介绍的表的常用函数。

获取当前日期

在 PostgreSQL 中,您可以使用内置的 NOW() 函数获取当前日期和时间。以下语句将同时返回日期和时间

SELECT NOW();
now
-------------------------------
2021-09-27 15:22:53.679985+02
(1 row)

如果对时间不感兴趣,您也可以指定仅使用双冒号 :: 返回日期,将 DATETIME 值转换为 DATE

SELECT NOW()::date;
now
------------
2021-09-27
(1 row)

使用 CURRENT_DATE 是获取当前日期的另一种方式,如下所示

SELECT CURRENT_DATE;
current_date
--------------
2021-09-27
(1 row)

所有这三个选项都将以 yyyy-mm-dd 格式返回日期。在 PostgreSQL 中,您可以根据需要调整此输出的格式。

以特定格式输出日期值

要以特定格式输出日期值,您可以使用 TO_CHAR() 函数。此函数接受两个参数

  1. 您要格式化的值
  2. 定义输出格式的模板
SELECT TO_CHAR(NOW()::date, 'dd/mm/yyyy');
to_char
------------
27/09/2021
(1 row)

您还可以以 Sep 27, 2021 这样的格式显示日期

SELECT TO_CHAR(NOW():: DATE, 'Mon dd, yyyy');
to_char
--------------
Sep 27, 2021
(1 row)

根据系统的要求,您可能需要以特定方式格式化的日期。在这种情况下,能够在 PostgreSQL 中指定输出非常有用。

获取两个日期之间的间隔

PostgreSQL 允许您使用 - 运算符获取两个日期之间的 间隔。使用此运算符,您可以计算员工的任期或书籍出版以来的时间等。

在我们的示例中,我们想知道自乔伊斯《尤利西斯》出版以来已经过了多少天,方法是从 published_date 中减去当前日期

SELECT
author_name,
book_title,
now()::date - published_date as diff
FROM
checkouts;

结果为

author_name | book_title | diff
-------------+------------+----------------------------
James Joyce | Ulysses | 36397 days
(1 row)

使用日期值计算年龄

我们可以继续使用相同的示例,使用 AGE() 函数计算当前日期的年龄,以年、月和日为单位。以下语句使用 AGE() 函数计算我们图书馆 checkouts 表中出版物的年龄

SELECT
author_name,
book_title,
AGE(published_date)
FROM
checkouts;

使用此函数,我们可以计算库存中书籍的年龄

author_name | book_title | age
-------------+------------+-------------------------
James Joyce | Ulysses | 99 years 7 mons 25 days
(1 row)

重要的是要注意,如果您将单个日期传递到 AGE() 函数中,它将自动使用当前日期进行减法和计算。您还可以将两个日期传递到函数中来计算年龄,例如

SELECT
author_name,
book_title,
AGE('2000-01-01',published_date),
FROM
checkouts;

结果为

author_name | book_title | age
-------------+------------+--------------------------
James Joyce | Ulysses | 77 years 10 mons 27 days
(1 row)

从日期值中提取年、季度、月、周或日

我们要介绍的最后一个函数是 PostgreSQL 中的 EXTRACT() 函数,它允许您分离日期的组成部分,如年、季度、月和日。

以下语句从《尤利西斯》的出版日期中提取年、月和日

SELECT
author_name,
book_title,
EXTRACT(YEAR FROM published_date) AS YEAR,
EXTRACT(MONTH FROM published_date) AS MONTH,
EXTRACT(DAY FROM published_date) AS DAY
FROM
checkouts;

结果将如下所示

author_name | book_title | year | month | day
-------------+------------+------+-------+-----
James Joyce | Ulysses | 1922 | 2 | 2
(1 row)

例如,当您可能只需要日期值的一部分来进行数据计算时,这是一个有用的函数。

结论

在本指南中,我们介绍了您可以对 PostgreSQL 中的 DATE 数据类型执行的基本操作。了解日期数据在数据库内部的工作方式非常重要。掌握访问和操作日期数据的方法,您可以进行年龄计算、在查询中执行提取,并在必要时配置输出以匹配另一个系统的要求。

常见问题解答

PostgreSQL 中日期数据类型的日期格式为 yyyy-mm-dd。这是用于存储数据和插入数据的格式。

PostgreSQL 中的 DATE_PART() 函数用于从日期或时间值中子查询子字段。

基本语法如下所示

SELECT DATE_PART(field, source);

例如,您可以编写以下内容并返回小时数 20

SELECT DATE_PART('hour', timestamp '2001-02-16 20:38:40');

PostgreSQL 中的 TO_DATE() 函数可用于将文本字符串转换为日期类型。

基本语法如下所示

TO_DATE(text, format);

例如

TO_DATE('20220317', 'YYYYMMDD');

返回 2022-03-17 的输出。

要在 PostgreSQL 中提取日期的一部分,您可以使用 EXTRACT() 函数。此函数可以从日期类型中解析出年、月或日,并指定季度。

基本语法如下所示

SELECT EXTRACT(field FROM source);

一个例子是

SELECT EXTRACT(YEAR FROM TIMESTAMP '2022-03-17 20:38:16');

此语句的返回值为 2022

您可以使用 DATE_TRUNC() 函数在 PostgreSQL 中截断时间戳。此函数根据指定的日期部分(例如年、月、日等)截断 TIMESTAMPINTERVAL

基本语法如下所示

DATE_TRUNC('datepart' field);

一个例子是

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

此语句的返回值为 2022-03-17 02:00:00

关于作者
Alex Emerich

Alex Emerich

Alex 是典型的观鸟爱好者、嘻哈音乐爱好者、书虫,也喜欢撰写关于数据库的文章。他目前居住在柏林,在那里人们可以看到他像利奥波德·布卢姆一样漫无目的地在城市中漫步。