PostgreSQL 语句记录

本文介绍了一系列实用的SQL技巧,包括创建索引以提高查询效率、生成连续日期的方法、使用date_trunc()函数处理时间戳以及如何生成连续日期并进行类型组合。这些技巧对于日常的数据管理和分析工作非常有用。

1、创建索引

-- 创建索引
CREATE SEQUENCE user_ID_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

-- 应用索引
alter table user alter column id set default nextval('user_ID_seq');

2、生成连续日期

-- 生成连续日期
SELECT
	daytime::date date_time 
FROM
	generate_series ( ( SELECT ( now( ) + INTERVAL '-1 month' ) :: DATE ), ( SELECT now( ) :: DATE ), '1 day' ) AS daytime
order by date_time;

3、date_trunc() 函数,用于将时间戳或时间间隔截断为指定的精度级别

-- 获取上月月初日期
select date_trunc('month', now() + '-1 months')::date

-- 获取月初日期
select date_trunc('month', now())

-- 查询上个月数据
date >= date_trunc('month', now() + '-1 months')::date
date < date_trunc('month', now())::date

-- 每月1号 12点
select date_trunc('month',now()) +interval '12 h';

-- 每月15号9点半
select date_trunc('month',now()) + interval '15 d 9 h 30 min';

-- 每天9点	
select date_trunc('day',now()) + interval '9 h';

-- 每周的今天
select date_trunc('day',now()) + interval '7 d';

-- 每周的周二第一分钟
select date_trunc('weak',now())  + interval '1d 1minute';

-- 每小时
select date_trunc('h',now()) + interval '30 minute';

-- 每分钟
select date_trunc('minute',now()) + interval '30 second';

-- 每30分钟
select date_trunc('minute',now()) + interval '30 minute 30 second';

-- 本季度的第15天,15小时 15分 30秒
select date_trunc('quarter',now()) + interval '15 d 15 h 15 minute 30 second';

-- 每个季度最后一天的晚上11点
select date_trunc('quarter',now() ) - interval '1 h';

-- 每个季度的最后一天的晚上的11点(从下个季度开始算起)
select date_trunc('quarter',now() + interval '3 month') - interval '1 h';

4、生成连续日期及将指定类型进行组合,即同一个日期对应多个类型行

-- 将生成的连续日期和类型进行组合成一张表(方法:将日期和类型表进行合并为以逗号拼接成字符串,然后将字符串分割成多行)
SELECT
	dt.date_time,
	UNNEST ( string_to_array( dt."type", ',' ) ) "type"
FROM
	(
	SELECT
		to_char( daytime, 'yyyy-MM-dd' ) date_time,
		( SELECT string_agg ( "type", ',' ) FROM ( SELECT DISTINCT "type" FROM table_1 ) ty ) "type" 
	FROM
		generate_series ( ( SELECT ( now( ) + INTERVAL '-1 month' ) :: DATE ), ( SELECT now( ) :: DATE ), '1 day' ) AS daytime 
	ORDER BY
		date_time 
	) dt

5、

### 设置字段为毫秒时间戳 PostgreSQL 提供了高精度的时间戳支持,其 `TIMESTAMP` 和 `TIMESTAMPTZ` 类型可以存储精确到微秒级别的时间值。如果需要存储毫秒级别的时间戳,可以通过将当前时间戳乘以 1000 并转换为整数实现,以获取自纪元以来的毫秒数[^1]。 #### 更新字段为当前毫秒时间戳 可以通过 `EXTRACT(EPOCH FROM CURRENT_TIMESTAMP)` 函数获取当前时间戳的纪元时间(以秒为单位),再乘以 1000 并转换为整数,以获得毫秒级别的整数值。例如: ```sql UPDATE your_table SET update_time_ms = EXTRACT(EPOCH FROM CURRENT_TIMESTAMP) * 1000 WHERE id = 1; ``` 该语句会将 `id = 1` 的记录的 `update_time_ms` 字段更新为当前时间的毫秒级时间戳。 #### 插入数据时设置毫秒时间戳 在插入数据时,同样可以使用上述表达式为字段赋值: ```sql INSERT INTO your_table (name, create_time_ms) VALUES ('example', EXTRACT(EPOCH FROM CURRENT_TIMESTAMP) * 1000); ``` 此语句会将 `create_time_ms` 字段设置为插入时的毫秒级时间戳。 #### 使用触发器自动设置毫秒时间戳 如果希望在每次更新记录时自动设置毫秒时间戳字段,可以结合触发器实现。定义一个函数来返回当前毫秒时间戳,并在更新操作前触发该函数[^3]: ```sql CREATE OR REPLACE FUNCTION set_update_time_ms() RETURNS TRIGGER AS $$ BEGIN NEW.update_time_ms = EXTRACT(EPOCH FROM CURRENT_TIMESTAMP) * 1000; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trg_set_update_time_ms BEFORE UPDATE ON your_table FOR EACH ROW EXECUTE FUNCTION set_update_time_ms(); ``` 上述触发器会在每次更新 `your_table` 表的记录之前,自动将 `update_time_ms` 字段设置为当前毫秒级时间戳。 ### 数据类型建议 由于毫秒时间戳通常表示为整数,建议将字段定义为 `BIGINT` 类型,以容纳较大的数值范围。例如: ```sql ALTER TABLE your_table ADD COLUMN update_time_ms BIGINT; ``` 这样可以确保字段能够存储完整的毫秒级时间戳值。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值