PostgreSQL 时间函数及格式类型
PostgreSQL 提供了丰富的日期和时间函数,以下是获取当天时间的不同格式的方法:
获取当前日期和时间
-- 当前日期和时间(带时区)
SELECT CURRENT_TIMESTAMP;
-- 示例输出: 2023-04-15 14:30:45.123456+08-- 当前日期和时间(不带时区)
SELECT LOCALTIMESTAMP;
-- 示例输出: 2023-04-15 14:30:45.123456-- 当前日期
SELECT CURRENT_DATE;
-- 示例输出: 2023-04-15-- 当前时间(带时区)
SELECT CURRENT_TIME;
-- 示例输出: 14:30:45.123456+08-- 当前时间(不带时区)
SELECT LOCALTIME;
-- 示例输出: 14:30:45.123456
获取当天特定格式的时间
-- YYYY-MM-DD 格式
SELECT TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD');-- DD/MM/YYYY 格式
SELECT TO_CHAR(CURRENT_DATE, 'DD/MM/YYYY');-- Month DD, YYYY 格式 (April 15, 2023)
SELECT TO_CHAR(CURRENT_DATE, 'Month DD, YYYY');-- 带时间的完整格式
SELECT TO_CHAR(CURRENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS');-- 带毫秒的时间格式
SELECT TO_CHAR(CURRENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.MS');-- 仅时间部分 (HH:MM:SS)
SELECT TO_CHAR(CURRENT_TIMESTAMP, 'HH24:MI:SS');-- 12小时制时间格式
SELECT TO_CHAR(CURRENT_TIMESTAMP, 'YYYY-MM-DD HH12:MI:SS AM');-- 一年中的第几天
SELECT TO_CHAR(CURRENT_DATE, 'DDD');-- 星期几 (Sunday, Monday...)
SELECT TO_CHAR(CURRENT_DATE, 'Day');-- 简写星期几 (Sun, Mon...)
SELECT TO_CHAR(CURRENT_DATE, 'Dy');-- ISO周数
SELECT TO_CHAR(CURRENT_DATE, 'IW');-- 季度
SELECT TO_CHAR(CURRENT_DATE, 'Q');
获取当天开始和结束时间
-- 当天开始时间 (00:00:00)
SELECT DATE_TRUNC('day', CURRENT_TIMESTAMP);
-- 或
SELECT CURRENT_DATE::timestamp;-- 当天结束时间 (23:59:59.999999)
SELECT DATE_TRUNC('day', CURRENT_TIMESTAMP) + INTERVAL '1 day' - INTERVAL '1 microsecond';-- 或者更简洁的写法
SELECT (CURRENT_DATE + 1)::timestamp - INTERVAL '1 microsecond';
其他有用的时间函数
-- 获取当前年份
SELECT EXTRACT(YEAR FROM CURRENT_DATE);-- 获取当前月份
SELECT EXTRACT(MONTH FROM CURRENT_DATE);-- 获取当前日
SELECT EXTRACT(DAY FROM CURRENT_DATE);-- 获取当前小时
SELECT EXTRACT(HOUR FROM CURRENT_TIME);-- 获取当前分钟
SELECT EXTRACT(MINUTE FROM CURRENT_TIME);-- 获取当前秒
SELECT EXTRACT(SECOND FROM CURRENT_TIME);
PostgreSQL 提供了丰富的日期和时间数据类型,以下是主要的日期时间类型:
1. 基本日期时间类型
DATE - 仅存储日期(不含时间)
格式:
YYYY-MM-DD
示例:
2023-04-15
范围:4713 BC 到 5874897 AD
TIME [ (p) ] [ WITHOUT TIME ZONE ] - 仅存储时间(不含日期和时区)
格式:
HH:MI:SS
示例:
14:30:45
或14:30:45.123456
精度(p):小数秒位数(0-6)
范围:00:00:00 到 24:00:00
TIME [ (p) ] WITH TIME ZONE - 存储时间(含时区)
格式:
HH:MI:SS+HH:MI
示例:
14:30:45+08:00
注意:使用时区的时间类型存在一些限制
TIMESTAMP [ (p) ] [ WITHOUT TIME ZONE ] - 存储日期和时间(不含时区)
格式:
YYYY-MM-DD HH:MI:SS
示例:
2023-04-15 14:30:45.123456
范围:4713 BC 到 294276 AD
TIMESTAMP [ (p) ] WITH TIME ZONE (简称 TIMESTAMPTZ) - 存储日期和时间(含时区)
格式:
YYYY-MM-DD HH:MI:SS+HH:MI
示例:
2023-04-15 14:30:45.123456+08
存储时自动转换为UTC,检索时转换为当前时区
2. 特殊日期时间类型
INTERVAL - 时间间隔
格式:
[quantity unit [quantity unit...]]
示例:
1 day 12:30:00
或3 months 2 days
用于表示时间跨度
tsrange, tstzrange - 时间范围
表示一个时间段的开始和结束
示例:
[2023-01-01, 2023-12-31)
3. 其他相关类型
SMALLDATETIME (在某些PostgreSQL扩展中提供)
类似于TIMESTAMP但精度较低
范围:1900-01-01 到 2079-06-06
精度:分钟
类型选择建议
如果只需要日期,使用 DATE
如果只需要时间,使用 TIME
如果需要日期和时间:
不考虑时区:TIMESTAMP
考虑时区:TIMESTAMPTZ (推荐)
如果需要时间间隔:INTERVAL
CREATE TABLE events (event_id SERIAL PRIMARY KEY,event_name VARCHAR(100),start_date DATE,start_time TIME,end_timestamp TIMESTAMP,created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,duration INTERVAL
);