简介
在数据库中存储日期值,可让你在查询和分析数据时加入时间元素。了解如何在各自的数据库中使用日期类型非常重要,这样你才能在报告中保持准确,无论是订单信息、人员年龄还是任何其他用例。
在本指南中,我们将讨论在 PostgreSQL 中存储 DATE
类型以及处理它们的不同方式。
PostgreSQL DATE
数据类型
PostgreSQL 中的 DATE
类型可以存储不带关联时间值的日期。
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
。