如何在函数选择中使用IF和ELSE?

时间:2015-10-28 18:23:13

标签: php mysql sql function if-statement

以下代码将根据公历计算年龄: 我有两行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年,我用它作为样本

enter image description here

谢谢

2 个答案:

答案 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年之前根据波斯日历。

说明中似乎有两个错误:

  1. 你提到你想用1600检查CURRENT_DATE,但这没有任何意义,因为 CURRENT_DATE是今天的日期,并且始终大于1.1.1600。 我认为这是一个错误,出生日期是有意的。
  2. 一个案例中公式中有365个,另一个案例中有365.25个。它们都应该是365.25。
  3. 对公式的一些优化:

    关于死亡日期的部分可以缩短:

    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。