PostgreSQL 教程: date 日期数据类型

八月 23, 2023

摘要:本教程讨论 PostgreSQL 的 DATE 数据类型,并向您展示如何使用一些方便的日期函数来处理日期值。

PostgreSQL DATE 数据类型简介

要存储日期值,请使用 PostgreSQL DATE 数据类型。PostgreSQL 使用 4 个字节来存储日期值。DATE数据类型的最低和最高值为 4713 BC 和 5874897 AD。

存储日期值时,PostgreSQL 使用yyyy-mm-dd格式,例如 2000-12-31。它还使用此格式插入数据到日期列。

如果您创建的表包含一个DATE列,并且希望使用当前日期作为该列的默认值,则可以在DEFAULT关键字后面使用CURRENT_DATE

例如,以下语句创建包含具有DATE数据类型的posting_date列的documents表。该posting_date列使用当前日期作为默认值。

DROP TABLE IF EXISTS documents;

CREATE TABLE documents (
	document_id serial PRIMARY KEY,
	header_text VARCHAR (255) NOT NULL,
	posting_date DATE NOT NULL DEFAULT CURRENT_DATE
);

INSERT INTO documents (header_text)
VALUES('Billing to customer XYZ');

SELECT * FROM documents;

下面显示了上面查询的输出。请注意,您可能会根据数据库服务器的当前日期获得不同的过账日期值。

 document_id |       header_text       | posting_date
-------------+-------------------------+--------------
           1 | Billing to customer XYZ | 2016-06-23
(1 row)

PostgreSQL 日期函数

为了演示,我们将创建一个新的employees,该表由employee_idfirst_namelast_namebirth_datehire_date列组成,其中birth_datehire_date列的数据类型为DATE

DROP TABLE IF EXISTS employees;

CREATE TABLE employees (
	employee_id serial PRIMARY KEY,
	first_name VARCHAR (255),
	last_name VARCHAR (355),
	birth_date DATE NOT NULL,
	hire_date DATE NOT NULL
);

INSERT INTO employees (first_name, last_name, birth_date, hire_date)
VALUES ('Shannon','Freeman','1980-01-01','2005-01-01'),
	   ('Sheila','Wells','1978-02-05','2003-01-01'),
	   ('Ethel','Webb','1975-01-01','2001-01-01');

1) 获取当前日期

要获取当前日期和时间,您可以使用内置的NOW()函数。但是,要仅获取日期部分(不包含时间部分),请使用双冒号 (::) 将DATETIME值转换为DATE值。

以下语句返回数据库服务器的当前日期:

SELECT NOW()::date;

获取当前日期的另一种方法是使用CURRENT_DATE,如下:

SELECT CURRENT_DATE;

结果的格式为:yyyy-mm-dd。但是,您可以将日期值输出为各种格式。

2) 以特定格式输出 PostgreSQL 日期值

要以特定格式输出日期值,可以使用TO_CHAR()函数。该TO_CHAR()函数接受两个参数。第一个参数是要格式化的值,第二个参数是定义输出格式的模板。

例如,要以dd/mm/yyyy格式显示当前日期,请使用以下语句:

SELECT TO_CHAR(NOW() :: DATE, 'dd/mm/yyyy');
  to_char
------------
 23/06/2016
(1 row)

或者要以类似Jun 22, 2016的格式显示日期,请使用以下语句:

SELECT TO_CHAR(NOW() :: DATE, 'Mon dd, yyyy');
   to_char
--------------
 Jun 23, 2016
(1 row)

3) 获取两个日期之间的间隔

要获取两个日期之间的间隔,请使用减号 (-) 运算符。

以下示例通过从今天的日期减去hire_date列中的值来获取员工的服务天数:

SELECT
	first_name,
	last_name,
	now() - hire_date as diff
FROM
	employees;
 first_name | last_name |           diff
------------+-----------+---------------------------
 Shannon    | Freeman   | 4191 days 08:25:30.634458
 Sheila     | Wells     | 4922 days 08:25:30.634458
 Ethel      | Webb      | 5652 days 08:25:30.634458
(3 rows)

4) 计算年龄(年、月、日)

要计算相对于当前日期的年龄(以年、月和日为单位),请使用AGE()函数。

以下语句使用AGE()函数计算employees表中员工的年龄。

SELECT
	employee_id,
	first_name,
	last_name,
	AGE(birth_date)
FROM
	employees;
 employee_id | first_name | last_name |           age
-------------+------------+-----------+-------------------------
           1 | Shannon    | Freeman   | 36 years 5 mons 22 days
           2 | Sheila     | Wells     | 38 years 4 mons 18 days
           3 | Ethel      | Webb      | 41 years 5 mons 22 days
(3 rows)

如果将日期值传递给AGE()函数,它将从当前日期中减去该日期值。如果将两个参数传递给AGE()函数,它将从第一个参数中减去第二个参数。

例如,要获取日期为01/01/2015时员工的年龄,请使用以下语句:

SELECT
	employee_id,
	first_name,
	last_name,
	age('2015-01-01',birth_date)
FROM
	employees;
 employee_id | first_name | last_name |           age
-------------+------------+-----------+--------------------------
           1 | Shannon    | Freeman   | 35 years
           2 | Sheila     | Wells     | 36 years 10 mons 24 days
           3 | Ethel      | Webb      | 40 years
(3 rows)

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

要从日期值获取年、季度、月、周、日,可以使用EXTRACT()函数。

以下语句从员工的出生日期中提取年、月、日:

SELECT
	employee_id,
	first_name,
	last_name,
	EXTRACT (YEAR FROM birth_date) AS YEAR,
	EXTRACT (MONTH FROM birth_date) AS MONTH,
	EXTRACT (DAY FROM birth_date) AS DAY
FROM
	employees;
 employee_id | first_name | last_name | year | month | day
-------------+------------+-----------+------+-------+-----
           1 | Shannon    | Freeman   | 1980 |     1 |   1
           2 | Sheila     | Wells     | 1978 |     2 |   5
           3 | Ethel      | Webb      | 1975 |     1 |   1
(3 rows)

在本教程中,您了解了 PostgreSQL 的DATE数据类型和一些处理日期值的方便函数。