ITPUB论坛 » MS SQL Server » 询问一个简单的SQL语句写法
新一届的微软MVP评选已经开始,欢迎各位推荐!
2008-7-3 17:09 reloadsoft
询问一个简单的SQL语句写法

请问如何通过身份证查询到年龄,包括年龄的具体范围: 如 我要查询10-20岁之间的年龄的有多少条数据?
一定要用身份证查询

2008-7-3 18:08 smthgdin
既然用身份证就没必要范围,身份证唯一的。 查的德结果唯一。

2008-7-3 18:12 reloadsoft
回复 #2 smthgdin 的帖子

就因为是身份证是唯一的所以才要通过身份证查询年龄,你么明白我意思,我意思是用身份证字段通过SQL查询年龄范围,比如我一张表要查询10-20岁的人怎么查?

2008-7-3 18:25 smthgdin
你表里面没有年龄字段?
要用匹配身份证上的出生年月?

2008-7-3 23:28 cosio
写个让你参考一下!

数据:
[color=Blue]-------------------------------------
1        350322199010106517
2        350322701010657



SQL:    (oracle下)   
---------------------
select case length(b02) when 18 then to_number(to_char(sysdate,'yyyy')) -to_number(substr(b02,7,4))
                        when 15 then to_number(to_char(sysdate,'yyyy')) -to_number('19'||substr(b02,7,2))
                        end from b
where (case length(b02) when 18 then to_number(to_char(sysdate,'yyyy')) -to_number(substr(b02,7,4))
                        when 15 then to_number(to_char(sysdate,'yyyy')) -to_number('19'||substr(b02,7,2))
                        end) between '10' and '20'

RESULT:
----------------
1        18[/color]

_____________________________

[[i] 本帖最后由 cosio 于 2008-7-3 23:31 编辑 [/i]]

2008-7-4 13:03 reloadsoft
回复 #4 smthgdin 的帖子

有年龄字段我就直接where age between 10 to 20了,还用身份证怎么复杂额。。。。。

2008-7-4 13:13 smthgdin
糟糕的表设计~~~~~
可以截取,但是这样写出来的sql执行效率不高。

2008-7-4 13:46 reloadsoft
回复 #5 cosio 的帖子

感觉很复杂,我记得以前我在学校写过这代码,不过肯定么那么复杂的,我在想想看,谢谢哦~~~~~~~~

2008-7-4 14:41 reloadsoft
回复 #8 reloadsoft 的帖子

后来我做出来的一个:
select 身份证号 from 表 where substring(身份证号,7,8) > '19920101' and substring(身份证号,7,8)<'19980101'  
就能推出年龄在16-20岁之间的身份证号,这样应该更简单把

2008-7-4 15:42 smthgdin
cosio 是给你个例子参考。思路类似的都是要截取字符串来比较。
我说过了,你那个写法可以,但是可能会牺牲性能,比如身份证本身就是索引的话,你那样写法索引用不到。

2008-7-5 09:22 Ryan-liumin
我也想截取字符串来比较,可好复杂的  还是简单点好 一般用reloadsoft 的方法

2008-7-8 20:17 xiebinren
用出生日期吧

2008-7-9 10:10 沙漠孤鹰
select count(*) as 记录数
   from 表
    where (select case len(身份证号)
                             when 18 then datediff(year, substring(身份证号,7,4), getdate())
                             when 15 then datediff(year, '19'+substring(身份证号,7,2), getdate())
                           end  as 年龄
           between 10 and 20)

2008-7-11 23:01 zaorv
用截取方法实现,如SUBSTRING().

2008-7-11 23:03 zaorv
考虑上15位的身份证

2008-7-12 12:47 马鞍
用substr截取就可以比较了阿

页: [1]


Powered by ITPUB论坛