我正在阅读docs中的MySql教程,并有以下表和SQL语句:
活动表:
+----------+------------+----------+------------------------------+
| name | date | type | remark |
+----------+------------+----------+------------------------------+
| Fluffy | 1995-05-15 | litter | 4 kittens, 3 females, 1 male |
| Buffy | 1993-06-23 | litter | 5 puppies, 2 female, 3 male |
| Buffy | 1994-06-19 | litter | 3 puppies, 3 female |
| Chirpy | 1999-03-21 | vet | needed beak streightened |
| Slim | 1997-08-03 | vet | broken rib |
| Bowser | 1991-10-12 | kennel | NULL |
| Fang | 1991-10-12 | kennel | NULL |
| Fang | 1998-08-28 | birthday | Gave him new chew toy |
| Claws | 1998-03-17 | birthday | Gave him a flea collar |
| Whistler | 1998-12-09 | birthday | First birthday |
+----------+------------+----------+------------------------------+
宠物餐桌:
+----------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+--------+---------+------+------------+------------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Fang | Benny | dog | m | 1990-08-27 | NULL |
| Bowser | Diane | dog | m | 1989-03-31 | 1995-07-29 |
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
| Jenny | Robert | dog | f | 2004-01-01 | 2014-05-04 |
+----------+--------+---------+------+------------+------------+
SQL:
select pet.name,
( YEAR(date) - YEAR(birth) ) - ( RIGHT(date,5) < RIGHT(birth,5) ) AS age, remark
from pet inner join event
on pet.name = event.name
where event.type = 'litter';
我理解除了这个之外的SQL语句:
( YEAR(date) - YEAR(birth) ) - ( RIGHT(date,5) < RIGHT(birth,5) )
逐步解释会有很大帮助。我知道YEAR()
函数用于从日期中提取年份。
答案 0 :(得分:3)
正如您所提到的那样,YEAR()
获得了该日期的年份。
我们将使用Fluffy作为birth = 1993-02-04
和date = 1995-05-15
第1步:
从两个日期( YEAR(date) - YEAR(birth) )
中减去提取的年份
你现在有1995 - 1993年等于2
第2步:
( RIGHT(date,5) < RIGHT(birth,5) )
这实际上会从右到左读取日期和出生字符串5步,所以如果你执行RIGHT(date,5)
,你将获得值0,如果你执行RIGHT(birth,5)
,你也会得到值为0.
第3步:
现在我们开始使用<
运算符,如果它满足条件,则返回布尔值1或0。由于0 = 0,语句为false,因此它将返回0.
整个功能实际上会检查date
的某一天是否小于birthdate
上的那一天,这将决定您是否有一整年前的剩余天数。如果你这样做,它将返回1,这将从你之前执行的当前年度操作中减去。
但在我们的情况下,由于<
将返回0,我们可以肯定地说Fluffy的年龄是2 - 0,即2。
但是,如果说Fluffy的birthdate
是在1993-12-04,这将为1
操作产生<
值,这意味着年份不是但完成后会产生2 - 1的结果,即1。
抱歉,如果它有点乱。
答案 1 :(得分:1)
这是一种聪明的(?)方式,用于检查出生日期的月份和日期是否发生在事件发生之前或之后(垃圾),以便正确计算事件之间的年数(因为年份本身并不足够。
在这部分:
( YEAR(date) - YEAR(birth) ) - ( RIGHT(date,5) < RIGHT(birth,5) )
RIGHT(date,5)
返回月份和日期部分(03-30
)并执行小于比较的布尔值,返回0或1,具体取决于结果。然后从YEAR(date) - YEAR(birth)
计算中减去该值,以便正确调整事件之间的年份。
答案 2 :(得分:1)
如果你出生于1980年并且我现在知道2015年,那么我可以几乎通过计算YEAR(date) - YEAR(birth) = 2015 - 1980 = 35
来计算你的年龄。关键是你的生日可能还没有发生。那我怎么知道你的生日是否已经发生?假设您出生于1980年7月20日。然后在MySQL日期格式中,您的生日看起来像2015-06-20。如果我查看您生日的最后5个字符,最右侧 5个字符,或RIGHT(birth, 5)
我会得到06-20。如果今天的最后5个字符的日期06-07
小于你生日的最后5个字符,那么你的生日还没有发生。在这里,通过&#34;小于&#34;我们的意思是它会在&#34;之前排序。按正常的字符串顺序。所以,如果RIGHT(date, 5) < RIGHT(birth, 5)
那么你的生日还没有发生。而且,幸运的是,MySQL会对待&#34; true&#34;数字1
和&#34; false&#34;作为数字0
。因此,只有在您的生日尚未结束时,上述内容才会从我们的日期计算中减去1
。