我可以在SQL语句中执行算术吗?

时间:2018-02-14 14:04:18

标签: php mysql codeigniter

我为公司数据库构建搜索功能,其中一个必要条件是年龄搜索,我可以将其构建为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条记录(正确)但是有更好的方法吗?非常感谢任何帮助,谢谢

2 个答案:

答案 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?