如何使用PDO& amp;获得从出生日期开始的年龄MySQL的?

时间:2013-05-27 18:51:01

标签: php mysql pdo

我不确切地知道如何把那些必要的代码显示给我使用mysql中的生日的年龄..总是给我1 ..你能告诉我我的错误在哪里吗?

这是代码:

<?php
$query = "SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(f_nacimiento, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(f_nacimiento, '00-%m-%d')) AS age from PACIENTES where id_paciente = $_GET[id_paciente]";
echo print $age; ?>

在db中,行f_nacimiento是日期类型(yyyy-mm-dd)

最好的问候!

3 个答案:

答案 0 :(得分:2)

结果只是“1”因为你选择了一个布尔表达式 也就是说,X < Y仅返回0或1。

在MySQL中进行日期算法的方法要简单得多。 DATEDIFF()函数返回两个日期之间的天数。

$query = "SELECT FLOOR(DATEDIFF(NOW(), f_nacimiento) / 365.25) AS age
    FROM PACIENTES
    WHERE id_paciente = ?";

if (($stmt = $pdo->prepare($query)) === false ) {
  die(print_r($pdo->errorInfo(), true));
}

$id_paciente = $_GET["id_paciente"];
if ($stmt->execute(array($id_paciente)) === false) {
  die(print_r($stmt->errorInfo(), true));
}

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  echo $row["age"] . "\n";
}

我测试的表格如下:

CREATE TABLE `PACIENTES` (
  `id_paciente` int(11) NOT NULL AUTO_INCREMENT,
  `f_nacimiento` date DEFAULT NULL,
  PRIMARY KEY (`id_paciente`)
) ENGINE=InnoDB;

PS:上面的示例代码显示了PDO编程的另外两个重要习惯:

  • 使用查询参数,不要将字符串直接插入SQL。
  • 检查从prepare()和execute()返回的错误状态。

重新评论,需要以年,月为单位显示年龄。这是我的第二次尝试(有趣的日子):

SELECT TIMESTAMPDIFF(YEAR
   , f_nacimiento
   , NOW()
   ) AS Years,
   TIMESTAMPDIFF(MONTH
   , f_nacimiento
       + INTERVAL TIMESTAMPDIFF(YEAR, f_nacimiento, NOW()) YEAR
   , NOW()
   ) AS Months,
   TIMESTAMPDIFF(DAY
   , f_nacimiento
       + INTERVAL TIMESTAMPDIFF(MONTH, f_nacimiento, NOW()) MONTH
   , NOW()
   ) AS Days
FROM PACIENTES
WHERE id_paciente = 1;

答案 1 :(得分:0)

使用此查询,因为您正在使用pdo,请使用预准备语句

SELECT EXTRACT(YEAR FROM NOW()) - EXTRACT(YEAR FROM f_nacimiento) age FROM pacientes WHERE id_paciente = ?

和php

$dbh = new PDO(.....
$st = $dbh->prepare($query);
$st->execute([(string)$_GET['id_paciente']]);
var_dump($st->fetchAll());

答案 2 :(得分:-1)

您需要在字符串中正确使用$ _GET变量。

$query = "SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(f_nacimiento, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(f_nacimiento, '00-%m-%d')) AS age from PACIENTES where id_paciente = $_GET[id_paciente]";

为:

$query = "SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(f_nacimiento, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(f_nacimiento, '00-%m-%d')) AS age from PACIENTES where id_paciente = \"" . $_GET['id_paciente'] . "\"";
// Do the query....