八月 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_id
、first_name
、last_name
、birth_date
和hire_date
列组成,其中birth_date
和hire_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
数据类型和一些处理日期值的方便函数。
了解更多
PostgreSQL 教程:数据类型
PostgreSQL 文档:日期/时间类型