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