我要做的是有一个名为“年龄”的字段。在添加一行时,从出生日期开始自动填充 - 诀窍是出生日期位于另一个领域。
我的两张表是:
学生
student_id(PK),first_name,last_name,date_of_birth
fitness_report
report_id(PK),test_date,test_period,age_tested,student_id(FK)
理想情况下,age_tested将从test_period进行计算,但是很高兴使用(),因为它将在合理的范围内。
显然我需要做的是创建一个触发器 - 但不确定SELECT语句是否可以填充年龄。非常感谢帮助。
答案 0 :(得分:0)
这是如何获得当前年龄:
select s.name, s.date_of_birth,
date_format(now(), '%Y') - date_format(date_of_birth, '%Y') -
(date_format(now(), '00-%m-%d') < date_format(date_of_birth, '00-%m-%d'))
as age
from s
这是如何让年龄达到test_period(不应该是test_date?):
select s.name, s.date_of_birth, r.test_period,
date_format(test_period, '%Y') - date_format(date_of_birth, '%Y') -
(date_format(test_period, '00-%m-%d') < date_format(date_of_birth, '00-%m-%d'))
as age
from r
join s on s.id_student = r.student_id
答案 1 :(得分:0)
正如rwilliams所说,不建议存储age_tested,因为它是多余的,但如果你想做什么,你可以在Mosty的解决方案中包含一个简单的触发器 -
CREATE TRIGGER fitness_report_insert BEFORE INSERT ON `fitness_report`
FOR EACH ROW
BEGIN
SET NEW.age_tested = (SELECT DATE_FORMAT(NEW.test_period, '%Y') - DATE_FORMAT(student.date_of_birth, '%Y') - (DATE_FORMAT(NEW.test_period, '00-%m-%d') < DATE_FORMAT(student.date_of_birth, '00-%m-%d')) FROM student WHERE student.student_id = NEW.student_id);
END
这假设test_period是Mosty之前提到的日期。我没有尝试过这个,因为我现在无法访问服务器,所以可能需要稍微调整一下。
更新:你可以尝试以下作为统计数据的起点 -
SELECT
DATE_FORMAT(test_period, '%Y') - DATE_FORMAT(date_of_birth, '%Y') - (DATE_FORMAT(test_period, '00-%m-%d') < DATE_FORMAT(date_of_birth, '00-%m-%d')) AS age,
s.gender,
AVG(r.score) AS score
FROM student s
INNER JOIN fitness_report r
ON s.student_id = r.student_id
GROUP BY age, s.gender