我为公司数据库构建搜索功能,其中一个必要条件是年龄搜索,我可以将其构建为MySQL查询吗?患者年龄是在预约时计算的(约会日期 - DOB),我使用最新的codeigniter框架,我尝试了一些变体:
$this->db->where("'" . 'app_date' . "' " . '-' . " '" . 'dob' . "' " . "=" . $age);
如果我使用echo $this->db->last_query()
:
SELECT
`book_all`.`pin`, `book_all`.`clinic`, `book_all`.`order_date`,
`book_all`.`app_date`, `book_all`.`dob`, `book_all`.`gender`,
`book_all`.`country`
FROM `book_all`
WHERE 'app_date' - 'dob' = 34
我确实计算输出的患者年龄,但数据库中的信息存储为两种不同的类型:order_date
是日期时间(Ymd他的),dob
是日期(Ymd)
我可以对结果数组做一个foreach,并取消设置任何不等于$age
的索引,但是它的数据库相当大,所以它使用了大量内存并减慢了执行时间:
$age_count = 0;
foreach ($query as &$val) {
if ($val['patient_age'] === intval($_POST['age'])) {
$age_count++;
} else {
unset($query[$age_count]);
$age_count++;
}
}
返回3条记录(正确)但是有更好的方法吗?非常感谢任何帮助,谢谢
答案 0 :(得分:2)
有一些功能专门针对您要做的事情,尤其是TIMESTAMPDIFF
。请参阅此处的手册,其中有一个具体示例:https://dev.mysql.com/doc/refman/5.7/en/date-calculations.html
MySQL还具有类似于PHP的日期格式功能。例如:
DATE_FORMAT(dob, '%H:%i:%s')
只要它能读取您的源格式。
答案 1 :(得分:0)
以下是有效查询的示例:
SELECT x.pin
, x.clinic
, x.order_date
, x.app_date
, x.dob
, x.gender
, x.country
FROM book_all x
WHERE x.app_date - INTERVAL 34 YEAR = x.dob
这可能不是你想要的,但它证明了这个概念。如需进一步帮助,请参阅:Why should I provide an MCVE for what seems to me to be a very simple SQL query?