简介
在数据库中存储日期值的能力使您能够为数据的查询和分析添加时间元素。了解如何在各自的数据库中使用日期类型非常重要,这样您才能准确地报告订单信息、人员年龄或任何其他用例。
在本指南中,我们将讨论在 PostgreSQL 中存储 DATE
类型以及使用它们的各种方法。
PostgreSQL DATE
数据类型
DATE
类型在 PostgreSQL 中 可以存储不带关联时间值的日期
DATE
PostgreSQL 使用 4 个字节来存储日期值。PostgreSQL 中日期值的范围是公元前 4713 年到公元 5874897 年。
存储日期值时,PostgreSQL 使用 yyyy-mm-dd
格式,例如 1994-10-27。此格式也用于 PostgreSQL 中的 插入数据。
在 PostgreSQL 中,可以设置当前日期的默认日期值。这可以在创建表时通过使用 DEFAULT
和 CURRENT_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()
函数。此函数接受两个参数
- 您要格式化的值
- 定义输出格式的模板
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
中减去当前日期
SELECTauthor_name,book_title,now()::date - published_date as diffFROMcheckouts;
结果为
author_name | book_title | diff-------------+------------+----------------------------James Joyce | Ulysses | 36397 days(1 row)
使用日期值计算年龄
我们可以继续使用相同的示例,使用 AGE()
函数计算当前日期的年龄,以年、月和日为单位。以下语句使用 AGE()
函数计算我们图书馆 checkouts
表中出版物的年龄
SELECTauthor_name,book_title,AGE(published_date)FROMcheckouts;
使用此函数,我们可以计算库存中书籍的年龄
author_name | book_title | age-------------+------------+-------------------------James Joyce | Ulysses | 99 years 7 mons 25 days(1 row)
重要的是要注意,如果您将单个日期传递到 AGE()
函数中,它将自动使用当前日期进行减法和计算。您还可以将两个日期传递到函数中来计算年龄,例如
SELECTauthor_name,book_title,AGE('2000-01-01',published_date),FROMcheckouts;
结果为
author_name | book_title | age-------------+------------+--------------------------James Joyce | Ulysses | 77 years 10 mons 27 days(1 row)
从日期值中提取年、季度、月、周或日
我们要介绍的最后一个函数是 PostgreSQL 中的 EXTRACT()
函数,它允许您分离日期的组成部分,如年、季度、月和日。
以下语句从《尤利西斯》的出版日期中提取年、月和日
SELECTauthor_name,book_title,EXTRACT(YEAR FROM published_date) AS YEAR,EXTRACT(MONTH FROM published_date) AS MONTH,EXTRACT(DAY FROM published_date) AS DAYFROMcheckouts;
结果将如下所示
author_name | book_title | year | month | day-------------+------------+------+-------+-----James Joyce | Ulysses | 1922 | 2 | 2(1 row)
例如,当您可能只需要日期值的一部分来进行数据计算时,这是一个有用的函数。
结论
在本指南中,我们介绍了您可以对 PostgreSQL 中的 DATE
数据类型执行的基本操作。了解日期数据在数据库内部的工作方式非常重要。掌握访问和操作日期数据的方法,您可以进行年龄计算、在查询中执行提取,并在必要时配置输出以匹配另一个系统的要求。
如果您将 Prisma Client 与 PostgreSQL 一起使用,以下是有关 Prisma Client 如何转换 PostgreSQL 的日期类型 的一些信息。
常见问题解答
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 中截断时间戳。此函数根据指定的日期部分(例如年、月、日等)截断 TIMESTAMP
或 INTERVAL
。
基本语法如下所示
DATE_TRUNC('datepart' field);
一个例子是
DATE_TRUNC('hour', TIMESTAMP '2022-03-17 02:09:30');
此语句的返回值为 2022-03-17 02:00:00
。