分享到

简介

在数据库中存储日期值,可让你在查询和分析数据时加入时间元素。了解如何在各自的数据库中使用日期类型非常重要,这样你才能在报告中保持准确,无论是订单信息、人员年龄还是任何其他用例。

在本指南中,我们将讨论在 PostgreSQL 中存储 DATE 类型以及处理它们的不同方式。

PostgreSQL DATE 数据类型

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

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 是一个典型的观鸟者、热爱嘻哈的“书虫”,也喜欢写关于数据库的文章。他目前住在柏林,在那里人们可以看到他像利奥波德·布鲁姆一样漫无目的地在城市中行走。
© . All rights reserved.