问答

查询年龄为18周岁至35周岁且省份开头为42或者41的身份证号码记录

作者:admin 2021-06-17 我要评论

假设表名为 table_name , 身份证字段名为 cert_number ,身份证号码形如 330103190012012321 ### 假设都是 18 位身份证,取相应位置的字符串转换成数字即可: //...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

假设表名为 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有这么多的函数。

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 有哪些免费轻量级的适用于日志收集与展

    有哪些免费轻量级的适用于日志收集与展

  • 怎么讲JS 对象的value 赋值到key,形成

    怎么讲JS 对象的value 赋值到key,形成

  • 延迟队列DelayQueue的getDelay()方法,

    延迟队列DelayQueue的getDelay()方法,

  • input file 写了 accept="image/*"

    input file 写了 accept="image/*"

腾讯云代理商
海外云服务器