PostgreSQL 设置时区,时间/日期函数汇总

文章目录


前言

本文基于 PostgreSQL 12.6 版本,不同版本的函数可能存在差异。

查看版本 psql --version


查看时区

sql 复制代码
show timezone; --UTC
select now(); -- 2023-07-24 09:22:48.589640 +00:00

视图 pg_timezone_names 保存了所有可供选择的时区

sql 复制代码
select * from pg_timezone_names;

查询 PRC 时区

sql 复制代码
select * from pg_timezone_names where name = 'PRC';

PRC是指中华人民共和国 PRC(People's Republic of China)。

修改时区

修改时区,设置成东八区 北京时间 UTC+8,默认为session级配置

sql 复制代码
set time zone 'PRC';
select now(); -- 2023-07-24 17:21:05.086183 +08:00

修改时区,用户级配置

sql 复制代码
alter role rolname set timezone='UTC'; -- 修改指定角色时区(rolname为角色名)
alter role all set timezone='UTC';     -- 修改所有角色时区

修改时区,数据库级配置

sql 复制代码
alter database dbname set timezone='UTC'; -- dbname为数据库名称

时间/日期操作符和函数

时间/日期操作符

操作符 例子 返回类型 结果
+ select date '2023-07-24' + integer '7'; date 2023-07-31
+ select date '2023-07-24' + interval '1 hour'; timestamp 2023-07-24 01:00:00.000000
+ select date '2023-07-24' + time '15:16'; timestamp 2023-07-24 15:16:00.000000
+ select interval '1 day' + interval '1 hour'; interval 0 years 0 mons 1 days 1 hours 0 mins 0.0 secs
+ select timestamp '2023-07-24 15:16' + interval '23 hours'; timestamp 2023-07-25 14:16:00.000000
+ select time '01:00' + interval '3 hours'; time 04:00:00
- select - interval '23 hours'; interval 0 years 0 mons 0 days -23 hours 0 mins 0.0 secs
- select date '2023-07-24' - date '2023-07-22'; integer 2
- select date '2023-07-24' - integer '7'; date 2023-07-17
- select date '2023-07-24' - interval '1 hour'; timestamp 2023-07-23 23:00:00.000000
- select time '05:00' - time '03:00'; interval 0 years 0 mons 0 days 2 hours 0 mins 0.0 secs
- select time '05:00' - interval '2 hours'; time 03:00:00
- select timestamp '2023-07-24 23:00' - interval '23 hours'; timestamp 2023-07-24 00:00:00.000000
- select interval '1 day' - interval '1 hour'; interval 0 years 0 mons 1 days -1 hours 0 mins 0.0 secs
- select timestamp '2023-07-24 03:00' - timestamp '2023-07-24 12:00'; interval 0 years 0 mons 0 days -9 hours 0 mins 0.0 secs
* select interval '1 hour' * double precision '3.5'; interval 0 years 0 mons 0 days 3 hours 30 mins 0.0 secs
/ select interval '1 hour' / double precision '1.5'; interval 0 years 0 mons 0 days 0 hours 40 mins 0.0 secs

日期/时间函数:

函数 描述 例子 返回类型 结果
age(timestamp, timestamp) 第1个timestamp 减去 第2个timestamp select age('2023-07-24', '1997-10-26'); interval 25 years 8 mons 29 days 0 hours 0 mins 0.0 secs
age(timestamp) 从current_date 减去 timestamp的值 select age(timestamp '1997-10-26'); interval 25 years 8 mons 29 days 0 hours 0 mins 0.0 secs
current_date 今天的日期 select current_date; date 2023-07-24
current_time 现在的时间 select current_time; time 07:53:43.911756 +00:00
current_timestamp 日期和时间 select current_timestamp; timestamp 2023-07-24 07:54:19.495372 +00:00
date_part(text, timestamp) 获取子域(等效于extract) select date_part('hour', timestamp '2023-07-24 15:56:34'); double 15
date_part(text, interval) 获取子域(等效于extract) select date_part('month', interval '2 years 3 months'); double 3
date_trunc(text, timestamp) 截断成指定的精度 select date_trunc('hour', timestamp '2023-07-24 15:56:34'); timestamp 2023-07-24 15:00:00.000000
extract(field from timestamp) 获取子域 select extract(hour from timestamp '2023-07-24 15:56:34'); double 15
extract(field from interval) 获取子域 select extract(month from interval '2 years 3 months'); double 3
localtime 当前时间 select localtime; time 08:00:08
localtimestamp 当前日期和时间 select localtimestamp; timestamp 2023-07-24 08:05:03.650472
now() 当前的日期和时间(等效于current_timestamp) select now(); timestamp 2023-07-24 08:09:30.828408 +00:00
timeofday() 当前日期和时间 select timeofday(); text Mon Jul 24 08:09:51.870484 2023 UTC

extract,date_part函数支持的field

extractdate_part 这两个函数可以从日期时间值中提取指定的部分,例如年份、月份、小时等。extract 是一个 PostgreSQL 特有的函数,而 date_part 在标准 SQL 中也有定义,但两者的功能类似。

描述 例子 结果
century 世纪 select extract(century from timestamp '2023-07-24 15:56:34'); 21
day (月份)里的日期域(1-31) select extract(day from timestamp '2023-07-24 15:56:34'); 24
decade 年份域除以10 select extract(decade from timestamp '2023-07-24 15:56:34'); 202
dow 每周的星期号(0-6;星期天是0) (仅用于timestamp) select extract(dow from timestamp '2023-07-24 15:56:34'); 1
doy 一年的第几天(1 -365/366) (仅用于 timestamp) select extract(doy from timestamp '2023-07-24 15:56:34'); 205
epoch Unix时间戳 select extract(epoch from timestamp '2023-07-24 15:56:34'); 1690214194
hour 小时域(0-23) select extract(hour from timestamp '2023-07-24 15:56:34'); 15
isodow ISO 周几(1-7,其中1代表星期一) select extract(isodow from timestamp '2023-07-24 15:56:34'); 1
isoyear ISO 年份 select extract(isoyear from timestamp '2023-07-24 15:56:34'); 2023
millennium 千年((年份/1000)+1) select extract(millennium from timestamp '2023-07-24 15:56:34'); 3
microseconds 微秒 select extract(microseconds from TIME '15:56:34.5'); 34500000
millisecond 毫秒 select extract(millisecon from TIME '15:56:34.5'); 34500
minute 分钟(0-59) select extract(minute from timestamp '2023-07-24 15:56:34'); 56
month 月份,对于timestamp数值,它是一年里的月份数(1-12);对于interval数值,它是月的数目,然后对12取模(0-11) select extract(month from timestamp '2023-07-24 15:56:34'); 7
quarter 季度,该天所在的该年的季度(1-4)(仅用于 timestamp) select extract(quarter from timestamp '2023-07-24 15:56:34'); 3
second 秒域,包括小数部分(0-59[1]) select extract(second from timestamp '2023-07-24 15:56:34'); 34
week 该天在所在的年份里是第几周。 select extract(week from timestamp '2023-07-24 15:56:34'); 30
year 年份域 select extract(year from timestamp '2023-07-24 15:56:34'); 2023

数据类型格式化函数

PostgreSQL格式化函数提供一套有效的工具用于把各种数据类型(日期/时间、integer、floating point和numeric)转换成格式化的字符串以及反过来从格式化的字符串转换成指定的数据类型。

to_char 函数第一个参数是待格式化的值,而第二个是定义输出或输出格式的模板。

函数 描述 例子 返回类型 结果
to_char(timestamp, text) 把时间戳转换成字串 select to_char(current_timestamp, 'HH12:MI:SS'); text 06:03:19
to_char(interval, text) 把时间间隔转为字串 select to_char(interval '14h 6m 20s', 'HH24:MI:SS'); text 14:06:20
to_date(text, text) 把字串转换成日期 select to_date('25 Jul 2023', 'DD Mon YYYY'); date 2023-07-24
to_timestamp(text, text) 把字串转换成时间戳 select to_timestamp('25 Jul 2023', 'DD Mon YYYY'); timestamp 2023-07-24 00:00:00.000000 +00:00
to_timestamp(double) 把UNIX纪元转换成时间戳 select to_timestamp(1690179888); timestamp 2023-07-24 06:24:48.000000 +00:00

用于日期/时间格式化的模式:

模式 描述
HH 一天的小时数(01-12)
HH12 一天的小时数(01-12)
HH24 一天的小时数(00-23)
MI 分钟(00-59)
SS 秒(00-59)
MS 毫秒(000-999)
US 微秒(000000-999999)
AM 正午标识(大写)
Y,YYY 带逗号的年(4和更多位)
YYYY 年(4和更多位)
YYY 年的后三位
YY 年的后两位
Y 年的最后一位
MONTH 全长大写月份名(空白填充为9字符)
Month 全长混合大小写月份名(空白填充为9字符)
month 全长小写月份名(空白填充为9字符)
MON 大写缩写月份名(3字符)
Mon 缩写混合大小写月份名(3字符)
mon 小写缩写月份名(3字符)
MM 月份号(01-12)
DAY 全长大写日期名(空白填充为9字符)
Day 全长混合大小写日期名(空白填充为9字符)
day 全长小写日期名(空白填充为9字符)
DY 缩写大写日期名(3字符)
Dy 缩写混合大小写日期名(3字符)
dy 缩写小写日期名(3字符)
DDD 一年里的日子(001-366)
DD 一个月里的日子(01-31)
D 一周里的日子(1-7;周日是1)
W 一个月里的周数(1-5)(第一周从该月第一天开始)
WW 一年里的周数(1-53)(第一周从该年的第一天开始)

示例:

sql 复制代码
-- 查询今天是今年的第几天
select to_char(now(), 'DDD'); -- 205

扩展

查询某个日期是否在某段日期范围,可以使用 >< 判断;如果使用了 between ,则前一个日期必须小于后一个日期。

示例:

sql 复制代码
-- between 错误用法
select date '2023-07-24' between date('2023-07-25') - 1 and date('2023-07-25') - 7; -- false

-- between 正确用法
select date '2023-07-24' between date('2023-07-25') - 7 and date('2023-07-25') - 1; -- true
相关推荐
日里安1 小时前
8. 基于 Redis 实现限流
数据库·redis·缓存
EasyCVR1 小时前
ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案
服务器·网络·数据库·音视频
Elastic 中国社区官方博客1 小时前
使用真实 Elasticsearch 进行更快的集成测试
大数据·运维·服务器·数据库·elasticsearch·搜索引擎·集成测试
明月与玄武2 小时前
关于性能测试:数据库的 SQL 性能优化实战
数据库·sql·性能优化
PGCCC4 小时前
【PGCCC】Postgresql 存储设计
数据库·postgresql
PcVue China5 小时前
PcVue + SQL Grid : 释放数据的无限潜力
大数据·服务器·数据库·sql·科技·安全·oracle
魔道不误砍柴功7 小时前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
锐策7 小时前
〔 MySQL 〕数据库基础
数据库·mysql
远歌已逝8 小时前
管理Oracle实例(二)
数据库·oracle
日月星宿~8 小时前
【MySQL】summary
数据库·mysql