
正文
mysql里年龄怎么表示 mysql按年龄从小到大排序
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
MySQL根据出生日期计算年龄的五种方法比较
以前使用mysql不是很多mysql里年龄怎么表示,对mysql的函数也不是很熟悉,遇到这个问题第一时间百度搜索,搜索到这两种方法,这两种方法是排在百度第一条的博客。
方法一,作者也说出了缺陷,就是当日期为未来日期时结果为0,而不是负数mysql里年龄怎么表示;这里使用了5个函数和两个运算符。
方法二,解决了方法一为负数的问题,但看起来更复杂;这里使用了6个函数和3个运算符。
看了这篇贴子后,我就晕了,怎么会这么复杂,以前用Sql Server很简单就可以了。我坚信一定有简单高效的方法。很快就找到了根据以上方法改良后的方法。
改良后的方法一,少了一个函数和一个运算符,当日期为未来日期时计算结果还是为0;
改良后的方法二,还是6个函数和3个运算符,看起来简单些;取日期的右边五位,当日期格式为‘2013-01-01’时取到的是‘01-01’,没有问题;当日期格式为‘2013-1-1’缩写格式时,取右边的五位取出的是‘3-1-1’,会导致出错。
然后自己根据MYSQL的帮助文档中的日期函数想到了第三种方法:
取生日和当前日期之前的天数除以一年的实际天数(365天5小时48分46秒),然后取整。这样只用了三个函数和一个运算符就搞定了。
然后,很快在国外网站找到了第四种方法:
这种方法只用了两个函数就搞定了,应该是最佳方法了。
测试了一下以上四种方法,假如当前日期为'2017-1-13',当生日为‘2013-1-14’时,还差一天就要过生日了,离4岁只 差一天了,结果还是3岁,感觉不是很合理;把方法三改造一下,四舍五入得到方法五:
这样计算出的年龄离实际的周岁最接近了,但可能方法四是最符合年龄定义的了。
相关问答
Q1: mysql中int,bigint,smallint 和 tinyint的区别详细介绍
主要的区别是占用空间和表示范围
tinyint 占用1字节
表示非负: 0--255
无符号表示:-128--127
举例表示人的年龄就可以用:age tinyint;
smallint 占用2字节
表示非负:0--2^16-1 既 0到65535
无符号表示:-2^15--2^15-1
举例表示乌龟的年龄:agewg smallint;
int 占用4字节
表示非负 0--2^32-1 既 零到四十二亿九千万
无符号表示:-2^31--2^31-1
举例表示恐龙化石年龄:agekl int;
bigint 占用8字节
表示非负 0--2^64-1 这已经是天文数字了,能表示 18后面17个零那么大的数字
无符号表示:-2^63--2^63-1
bigint比较占用空间,一般都不用。
举例表示宇宙年龄:ageyz bigint;
完全手打亲!
Q2: 深入理解mysql的联合索引
最近在学习MySQL的存储引擎和索引的知识。看了许多篇介绍MyISAM和InnoDB的索引的例子mysql里年龄怎么表示,都能理解。
像这张索引图:
PS:该图来自大神张洋的《MySQL索引背后的数据结构及算法原理》一文。
但许多文章讲述的都是单列索引mysql里年龄怎么表示,我很好奇 联合索引对应的结构图是怎样的。
比方说联合索引 (col1, col2,col3)mysql里年龄怎么表示,我知道在逻辑上是先按照col1进行排序再按照col2进行排序最后再按照col3进行排序。因此如果是select * from table where col1 = 1 and col3 = 3的话,只有col1的索引部分能生效。但是其物理结构上这个联合索引是怎样存在的,我想不懂。
上网查阅了许多资料,总算有点眉目了。
假设这是一个多列索引(col1, col2,col3),对于叶子节点,是这样的:
PS:该图改自《MySQL索引背后的数据结构及算法原理》一文的配图。
也就是说,联合索引(col1, col2,col3)也是一棵B+Tree,其非叶子节点存储的是第一个关键字的索引,而叶节点存储的则是三个关键字col1、col2、col3三个关键字的数据,且按照col1、col2、col3的顺序进行排序。
配图可能不太让人满意,因为col1都是不同的,也就是说在col1就已经能确定结果了。自己又画了一个图(有点丑),col1表示的是年龄,col2表示的是姓氏,col3表示的是名字。如下图:
PS:对应地址指的是数据记录的地址。
如图,联合索引(年龄, 姓氏,名字),叶节点上data域存储的是三个关键字的数据。且是按照年龄、姓氏、名字的顺序排列的。
因此,如果执行的是:
select * from STUDENT where 姓氏='李' and 名字='安';
或者
select * from STUDENT where 名字='安';
那么当执行查询的时候,是无法使用这个联合索引的。因为联合索引中是先根据年龄进行排序的。如果年龄没有先确定,直接对姓氏和名字进行查询的话,就相当于乱序查询一样,因此索引无法生效。因此查询是全表查询。
如果执行的是:
select * from STUDENT where 年龄=1 and 姓氏='李';
那么当执行查询的时候,索引是能生效的,从图中很直观的看出,age=1的是第一个叶子节点的前6条记录,在age=1的前提下,姓氏=’李’的是前3条。因此最终查询出来的是这三条,从而能获取到对应记录的地址。
如果执行的是:
select * from STUDENT where 年龄=1 and 姓氏='黄' and 名字='安';
那么索引也是生效的。
而如果执行的是:
select * from STUDENT where 年龄=1 and 名字='安';
那么,索引年龄部分能生效,名字部分不能生效。也就是说索引部分生效。
因此我对联合索引结构的理解就是B+Tree是按照第一个关键字进行索引,然后在叶子节点上按照第一个关键字、第二个关键字、第三个关键字…进行排序。
而之所以会有最左原则,是因为联合索引的B+Tree是按照第一个关键字进行索引排列的。
联合索引在B+树上的结构介绍
Q3: 怎么用SQL语句表示年龄?表中只有出生日期这个字段
首先呢根据题目来看实在数据库实现的时候没有考虑全面。在设计阶段可以只有出生日期,但应该能分析到年龄是经常使用的,必须将年龄设计成派生属性,在关系的实现时将其作为表的一个列age,并为其设置默认值year(getdate())-year(出生日期),这样在查询的时候直接查选age即可。建议修改表结构,一劳永逸。其次,如果不修改表结构,也只能使用sql中的日期函数,比如datediff。在这给出sqlserver中的写法:
select DATEDIFF(yy, GETDATE(), 出生日期) as 'age' from table_name
还有一种办法,就是在应用编程中操作,利用脚本语言进行处理。
Q4: MYSQL中身份证号怎么确认出生日期和年龄
根据下面情况确定。
身份证号码mysql里年龄怎么表示的意义
①前1、2位数字表示:所在省份mysql里年龄怎么表示的代码,河南mysql里年龄怎么表示的省份代码是41哦!
②第3、4位数字表示:所在城市mysql里年龄怎么表示的代码;
③第5、6位数字表示:所在区县的代码;
④第7~14位数字表示:出生年、月、日;
⑤第15、16位数字表示:所在地的派出所的代码;
⑥第17位数字表示性别:奇数表示男性,偶数表示女性;
⑦第18位数字是校检码:也有的说是个人信息码,一般是随计算机随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。
Q5: mysql查询年龄
在Mysql中计算年龄:
SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)), '%Y')+0 AS age FROM 表名;
关于mysql里年龄怎么表示和mysql按年龄从小到大排序的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。






