目录
[1. 日期格式化](#1. 日期格式化)
[2. 时间格式化](#2. 时间格式化)
[3. 日期和时间组合格式化](#3. 日期和时间组合格式化)
官网:https://postgresql.ac.cn/docs/current/datatype-datetime.html
数据类型 传递参数 参数格式
date 2022-08-16 年月日
time 13:06:54 时分秒
timestamp 2022-08-10 13:07:04 年月日时分秒
timestamptz 2022-08-10 13:07:08+00 年月日时分秒时区
timetz 17:07:02+00 时分秒时区
interval 30:30:30 -100:30:30 100:10:10 15 时间间隔
原文链接:https://blog.csdn.net/m0_46478042/article/details/144431667
| 名称 | 存储大小 | 描述 | 最小值 | 最大值 | 分辨率 |
|---|---|---|---|---|---|
timestamp [ (p) ] [ without time zone ] |
8 字节 | 日期和时间(无时区) | 公元前 4713 年 | 公元 294276 年 | 1 微秒 |
timestamp [ (p) ] with time zone |
8 字节 | 日期和时间(带时区) | 公元前 4713 年 | 公元 294276 年 | 1 微秒 |
date |
4 字节 | 日期(无时间) | 公元前 4713 年 | 公元 5874897 年 | 1 天 |
time [ (p) ] [ without time zone ] |
8 字节 | 时间(无日期) | 00:00:00 | 24:00:00 | 1 微秒 |
time [ (p) ] with time zone |
12 字节 | 时间(无日期,带时区) | 00:00:00+1559 | 24:00:00-1559 | 1 微秒 |
interval [ fields ] [ (p) ] |
16 字节 | 时间间隔 | -178000000 年 | 178000000 年 | 1 微秒 |
日期时间数据类型
PostgreSQL 支持多种日期时间数据类型,例如 timestamp、date、time 等。这些数据类型可以存储不同精度的时间信息。在进行日期时间格式转换之前,我们需要了解这些数据类型的特点。
timestamp
timestamp 数据类型用于存储日期和时间的完整信息,包括年、月、日、时、分、秒和时区。例如,2021-10-01 12:34:56+08 表示2021年10月1日12点34分56秒,时区为东八区。
date
date 数据类型用于存储日期信息,不包含具体的时间。例如,2021-10-01 表示2021年10月1日。
time
time 数据类型用于存储时间信息,不包含具体的日期。例如,12:34:56 表示12点34分56秒。
日期时间格式化函数
在 PostgreSQL 中,我们可以使用一些内置函数来对日期时间进行格式化。下面介绍几个常用的函数及其用法。
to_char()
to_char() 函数用于将日期或时间转换为指定的字符串格式。它接受两个参数:要转换的日期时间值和目标格式。
TO_CHAR(expression, format)
expression:需要进行格式化的时间 / 日期表达式,可以是日期、时间、时间戳等类型的数据,也可以是包含这些类型数据的列名。format:指定输出的格式模板,由一系列格式元素组成。
以下示例将 timestamp 类型的日期时间转换为指定格式的字符串:
sql
SELECT to_char('2021-10-01 12:34:56', 'YYYY-MM-DD HH12:MI:SS');
-- 输出:2021-10-01 12:34:56
1. 日期格式化
-
YYYY:四位数的年份。SELECT TO_CHAR(CURRENT_DATE, 'YYYY');
该语句会将当前日期中的年份以四位数形式输出。
-
MM:两位数的月份(01 - 12)。SELECT TO_CHAR(CURRENT_DATE, 'MM');
此语句会输出当前日期对应的两位数月份。
-
DD:两位数的日期(01 - 31)。SELECT TO_CHAR(CURRENT_DATE, 'DD');
它会返回当前日期中的日期部分,以两位数显示。
-
组合日期格式:可以将多个格式元素组合使用,以满足不同的日期显示需求。
SELECT TO_CHAR(CURRENT_DATE, 'YYYY年MM月DD日');
上述语句会将当前日期格式化为 "年 - 月 - 日" 的形式,如 "2025 年 05 月 10 日"。
2. 时间格式化
-
HH24:24 小时制的小时数(00 - 23)。SELECT TO_CHAR(CURRENT_TIME, 'HH24');
该语句会输出当前时间的 24 小时制小时数。
-
MI:分钟数(00 - 59)。SELECT TO_CHAR(CURRENT_TIME, 'MI');
它会返回当前时间的分钟部分。
-
SS:秒数(00 - 59)。SELECT TO_CHAR(CURRENT_TIME, 'SS');
此语句会输出当前时间的秒数。
-
组合时间格式:将不同的时间格式元素组合起来,形成完整的时间显示格式。
SELECT TO_CHAR(CURRENT_TIME, 'HH24:MI:SS');
该语句会将当前时间格式化为 "小时:分钟:秒" 的形式,如 "14:30:00"。
3. 日期和时间组合格式化
-
YYYY-MM-DD HH24:MI:SS:常见的日期和时间组合格式。SELECT TO_CHAR(CURRENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS');
extract()
**extract() 函数用于从日期或时间值中提取特定的部分,例如年、月、日、小时等。**它接受两个参数:要提取的部分和日期时间值。
以下示例提取 date 类型的日期的年份:
sql
SELECT extract(YEAR FROM create_time)from t_section_data
-- 输出:2021
to_timestamp()
to_timestamp() 函数用于将字符串转换为 timestamp 类型的日期时间值。它接受两个参数:要转换的字符串和日期时间的格式。
以下示例将字符串转换为 timestamp 类型的日期时间:
sql
SELECT to_timestamp('20211001', 'YYYYMMDD');
-- 输出:2021-10-01 00:00:00
自定义日期时间格式
除了使用内置函数,我们还可以自定义日期时间格式。在 PostgreSQL 中,我们可以使用特定的占位符来表示不同的日期时间部分。
占位符列表
下面是一些常用的占位符及其对应的日期时间部分:
YYYY:4位数的年份MM:两位数的月份DD:两位数的日期HH12:12小时制的小时数HH24:24小时制的小时数MI:分钟数SS:秒数
示例
以下示例演示了如何使用占位符来自定义日期时间格式:
sql
SELECT to_char(create_time, 'YYYY年MM月DD日 HH12时MI分SS秒')from t_section_data;-- 输出:2021年10月01日 12时34分56秒
SELECT to_char(create_time, 'YYYY年MM月DD日')from t_section_data;
-- 输出:2021年10月01日
SELECT to_char(create_time, 'HH24时MI分SS秒')from t_section_data;
-- 输出:12时34分56秒
记住年月日时分秒的模式字符串:YYYY-MM-DD HH24:MI:SS
日期 --> 字符串 to_char(date, formatString)
select to_char(now(), 'YYYY-MM-DD HH24, MI:SS')
字符串 --> 日期 to_date ('dateString', 'formatString')
select to_date('2021-12-18 22:24:15', 'YYYY-MM-DD HH24:MI:SS')
to_timestamp('20211001', 'YYYYMMDD');
SELECT to_timestamp('20211001', 'YYYYMMDD');
-- 输出:2021-10-01 00:00:00
https://blog.csdn.net/wuyujin1997/article/details/122018097
总结
通过使用 to_char() 函数可以方便地将日期时间转换为指定格式的字符串。
同时,extract() 函数可以提取日期时间值中的特定部分,帮助我们进行更精细的处理。
如果需要将字符串转换为日期时间类型,可以使用 to_timestamp() 函数。
参考:
https://www.cnblogs.com/dbasql/p/18765043
使用
--更新22数据为23号
update t_section_data_stat td SET arrive_time = arrive_time + INTERVAL '1 day' where td.arrive_time BETWEEN CURRENT_DATE - 2 AND CURRENT_DATE - INTERVAL '1 second'
WHERE arrive_time
BETWEEN CURRENT_DATE - 1
AND CURRENT_DATE - INTERVAL '1 second';
翻译成人话:
只匹配【昨天一整天】的数据,从 昨天 00:00:00 到 昨天 23:59:59
CURRENT_DATE
今天的日期(不带时间) 比如今天是 2026-03-24``CURRENT_DATE = 2026-03-24 00:00:00
CURRENT_DATE - 1
昨天 00:00:00
CURRENT_DATE - INTERVAL '1 second'
今天 00:00:00 往前减 1 秒= 昨天 23:59:59
组合起来就是:
bash
arrive_time >= 昨天 00:00:00
AND
arrive_time <= 昨天 23:59:59
-
arrive_time >= CURRENT_DATE -2→ 前天、昨天、今天 全部更新(范围太大) -
BETWEEN ... AND ...→ 只更新昨天(范围精准、安全)
WHERE arrive_time
BETWEEN CURRENT_DATE - 1
AND CURRENT_DATE - INTERVAL '1 second';
BETWEEN 昨天0点 AND 昨天23点59分59秒= 只筛选昨天一整天的数据
时区
--查看时区
select now();
--修改数据库时区 08 https://zhuanlan.zhihu.com/p/6698619251
--alter database "vims-set-das" set timezone='Asia/Shanghai';
超表
创建时候timestamptz 时区字段
