假设表名为 table_name
, 身份证字段名为cert_number
,身份证号码形如330103190012012321
假设都是 18 位身份证,取相应位置的字符串转换成数字即可:
// 以 MySql 为例,其他数据库的函数语法可能略有不同
SELECT `cert_number`
FROM `table_name`
WHERE LEFT(`cert_number`, 2) IN (41, 42)
AND (YEAR(NOW()) - SUBSTRING(`cert_number`, 7, 4)) >= 18
AND (YEAR(NOW()) - SUBSTRING(`cert_number`, 7, 4)) <= 35;
只写到年份了,月份和日还要继续精确的话自己往上 AND 吧;如果能在外面把两个日期范围当参数传进来就更好了,取 8 位生日做大小比较就可以了。
不过楼上说的对,这种查询啥索引也用不到,数据量一大一定会卡的不行不行的,最好还有有个冗余字段存一下地区和年月日信息。
###这.就算是写出来了,效率也是感人. 那为什么不考虑存储身份证的时候,把身份证中出生年月日单独拿出来存储呢?
###差不多类似下面
SELECT
*
FROM
table_name
WHERE
cert_number LIKE "41%"
OR
cert_number LIKE "42%"
HAVING
DATE_ADD(MID(cert_number, 7, 8), INTERVAL 18 YEAR) <= CURDATE()
AND
DATE_ADD(MID(cert_number, 7, 8), INTERVAL 35 YEAR) > CURDATE()
;
###这么难的需求都有人能实现,真的是太厉害了,没想到SQL有这么多的函数。