PostgreSQL 时间函数及格式类型

发布于:2025-08-17 ⋅ 阅读:(17) ⋅ 点赞:(0)

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

    • 用于表示时间跨度

  • tsrangetstzrange - 时间范围

    • 表示一个时间段的开始和结束

    • 示例:[2023-01-01, 2023-12-31)

3. 其他相关类型

  • SMALLDATETIME (在某些PostgreSQL扩展中提供)

    • 类似于TIMESTAMP但精度较低

    • 范围:1900-01-01 到 2079-06-06

    • 精度:分钟

类型选择建议

  1. 如果只需要日期,使用 DATE

  2. 如果只需要时间,使用 TIME

  3. 如果需要日期和时间:

    • 不考虑时区:TIMESTAMP

    • 考虑时区:TIMESTAMPTZ (推荐)

  4. 如果需要时间间隔: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
);


网站公告

今日签到

点亮在社区的每一天
去签到