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

DATE 类型简介

DATE 数据类型用于在 PostgreSQL 存储日期值。PostgreSQL 使用4字节来存储日期值。它的取值范围从公元前 4713 年到公元后 5874897 年。

PostgreSQL 使用 yyyy-mm-dd 的格式(yyyy:四位数的年份,比如 2018mm:两位数的月份,比如 01dd:两位数的天数,比如 09),比如:2018-01-11。在插入/更新数据时,也需要使用这一格式。

如果想使用当前日期作为 DATE 类型字段的默认值,可以在创建表的时候指定:在字段的数据类型后面加上 DEFAULT CURRENT_DATE。如下所示:

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;

日期函数

首先,建张用来做演示的表,并插入一些示例数据:

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');

获取当前日期

内置的 NOW() 函数可以获取到当前的日期和时间。如果只想要其中的日期部分,可以使用 :: 将其值转换为日期:

SELECT NOW()::date;

另一种方法,是使用 CURRENT_DATE

SELECT CURRENT_DATE;

计算两个日期之间相差多久

使用减号(-)可以计算出两个日期间相差多久:

SELECT
 first_name,
 last_name,
 now() - hire_date as diff
FROM
 employees;

计算年龄

下面的语句使用 age() 函数计算各员工的年龄:

SELECT
 employee_id,
 first_name,
 last_name,
 AGE(birth_date)
FROM
 employees;

从日期值里提取年份、月份、周数、天数

下面的语句使用 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)