查询年龄为18周岁至35周岁且省份开头为42或者41的身份证号码记录SQL语句怎么写?

假设表名为 table_name, 身份证字段名为cert_number,身份证号码形如330103190012012321

回复
阅读 3.3k
4 个回答

假设都是 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有这么多的函数。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏