以下代码将根据公历计算年龄: 我有两行sql代码,我将使用 IF和ELSE
将其用于下面的代码这就是我想要的:
function select($idPatient)
{
if ( $CURRENT_DATE > "1600")
{
$sql .= "FLOOR((TO_DAYS(GREATEST(IF(decease_date='0000-00-00',CURRENT_DATE,decease_date),IFNULL(decease_date,CURRENT_DATE))) - TO_DAYS(birth_date)) / 365.25) AS age";
}
else
{
$sql .= "FLOOR((TO_DAYS(GREATEST(IF(decease_date='0000-00-00',CURRENT_DATE,decease_date),IFNULL(decease_date,CURRENT_DATE))) - TO_DAYS(birth_date)) / 365.25) - 621 AS age";
}
return ($this->exec($sql) ? $this->numRows() : false);
}
问:在上面的代码中, IF 运行良好,但 ELSE 不起作用
更多信息:没有必要使用current_date,您可以使用任何东西来解决此问题。如果我们输入任何名称,它也会起作用!!!!因为当前日期是2015年,我用它作为样本
谢谢
答案 0 :(得分:0)
我会把你所拥有的东西一起粉碎,然后将它们粉碎成一个mysql,如果那么:
IF(YEAR(CURRENT_DATE)>1600,
FLOOR((TO_DAYS(GREATEST(IF(decease_date='0000-00-00',CURRENT_DATE,decease_date),
IFNULL(decease_date,CURRENT_DATE))) - TO_DAYS(birth_date)) / 365),
(FLOOR((TO_DAYS(GREATEST(IF(decease_date='0000-00-00',CURRENT_DATE,decease_date),
IFNULL(decease_date,CURRENT_DATE))) - TO_DAYS(birth_date)) / 365.25) - 621)
) as age
所以如果条件,中间sql,否则底部sql =列年龄。
答案 1 :(得分:0)
如果我理解正确,你想计算一个人的年龄, 在给定的出生和死亡日期之前。后者可以是0000-00-00或NULL,两者都可以 意思是这个人还活着。此外,您想检测日期是否 由波斯日历给出,并相应地更正计算。 假设日期在1600年之前根据波斯日历。
说明中似乎有两个错误:
对公式的一些优化:
关于死亡日期的部分可以缩短:
IFNULL(NULLIF(decease_date, '0000-00-00'),CURRENT_DATE)
这会将'0000-00-00'视为NULL,然后将NULL替换为CURRENT_DATE
原始公式计算decease_date和birth_date之间的天数差异 将结果除以365.25以获得它们之间的年数。但要得到这个数字 两天之间的年份可以使用函数TIMESTAMPDIFF来完成,所以你得到:
TIMESTAMPDIFF(YEAR,
IFNULL(NULLIF(decease_date, '0000-00-00'), CURRENT_DATE),
birth_date) as age
最后,您需要进行波斯日历检测。请注意,如果该人死亡 理论上没有必要做任何不同的事情;我们可以假设出生日期和死亡日期是 由相同的日历给出,因此年龄将被正确计算。 当人没有死亡日期(即该人还活着)时,就会出现差异。 在这种情况下,你想检查出生日期是否在1600之前(波斯语 日历)并从结果中减去621年。 现在,虽然这是一种方法,我建议另一个: 我们可以对总结果使用模运算,这实际上归结为 当年龄高于此时减去621。我们使用modulo operator %(与MOD函数相同):
TIMESTAMPDIFF(YEAR,
IFNULL(NULLIF(decease_date, '0000-00-00'),
CURRENT_DATE),
birth_date) % 621 as age
就是这样。不需要另外的IF。