POSTGRESQL通过身份证号码筛选年龄的两种方式

1 篇文章 0 订阅
1 篇文章 0 订阅

前言

SQL开发过程中,有时候会遇到需要筛选年龄范围,但只有身份证号码的情况,这种情况如何筛选,经过实践整理了一下两种方式。

一、年龄比较

计算出身份证好对应的年龄,再进行比较。主要函数age(timestamptz,timestamptz)用于计算年龄(26 years 10 months 9 days),date_part(text,text)用于获取age函数返回的年龄(26),to_date(text,text)用于转换字符串为时间

代码如下(示例):

select date_part('year',age(CURRENT_DATE,to_date(substr(身份证号码,7,8),'yyyyMMdd'))) between 10 and 20;

二、出生日期比较

计算需要筛选的年龄范围对应的出生日期范围,例:如需筛选20-40岁的信息,计算出生日期范围是1982-01-06 -----2000-01-06

代码如下(示例):

select to_date(substr(身份证号码,7,8),'yyyyMMdd') between '1980-01-06' and '2000-01-06';


 

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PostgreSQL 中,可以使用表分区技术实现数据分区。要使用身份证前6位来建立分区,可以按照以下步骤进行操作: 1. 创建一个父表,用于存储所有分区的元数据信息: ```sql CREATE TABLE partition_parent ( id SERIAL PRIMARY KEY, partition_name TEXT NOT NULL, partition_start TEXT NOT NULL, partition_end TEXT NOT NULL ); ``` 2. 创建一个函数,用于根据身份证前6位来计算分区名称: ```sql CREATE OR REPLACE FUNCTION partition_name_fn(id_num TEXT) RETURNS TEXT AS $$ DECLARE prefix TEXT; BEGIN prefix := SUBSTRING(id_num from 1 for 6); RETURN 'partition_' || prefix; END; $$ LANGUAGE plpgsql; ``` 3. 创建一个触发器,用于在插入数据时根据身份证前6位来将数据插入到对应的分区中: ```sql CREATE OR REPLACE FUNCTION partition_insert_fn() RETURNS TRIGGER AS $$ DECLARE partition_name TEXT; BEGIN partition_name := partition_name_fn(NEW.id_num); IF NOT EXISTS(SELECT relname FROM pg_class WHERE relname = partition_name) THEN EXECUTE 'CREATE TABLE ' || partition_name || ' (LIKE ' || TG_TABLE_NAME || ' INCLUDING ALL)'; EXECUTE 'ALTER TABLE ' || partition_name || ' ADD CONSTRAINT ' || partition_name || '_pk PRIMARY KEY (id)'; EXECUTE 'ALTER TABLE ' || partition_name || ' ADD CONSTRAINT ' || partition_name || '_check CHECK (id_num >= ''' || partition_start || ''' AND id_num < ''' || partition_end || ''')'; EXECUTE 'ALTER TABLE ' || partition_name || ' INHERIT ' || TG_TABLE_NAME; INSERT INTO partition_parent (partition_name, partition_start, partition_end) VALUES (partition_name, partition_start, partition_end); END IF; EXECUTE 'INSERT INTO ' || partition_name || ' SELECT ($1).*' USING NEW; RETURN NULL; END; $$ LANGUAGE plpgsql; CREATE TRIGGER partition_insert_trg BEFORE INSERT ON my_table FOR EACH ROW EXECUTE FUNCTION partition_insert_fn(); ``` 在上面的代码中,我们假设要对名为 my_table 的表进行分区,其中包含一个名为 id_num 的列,用于存储身份证号码。触发器会在插入数据时根据身份证前6位来计算分区名称,并将数据插入到对应的分区中。同时,如果该分区还不存在,则会动态创建该分区,并将元数据信息插入到 partition_parent 表中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaowangbadan0_0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值