2017-06-29 69 views
0

我需要在我的年齡計算函數中使用條件,但是如果人的年齡是「轉向」或「轉向」,如何實現'case when'來比較?如何在postgresql中創建函數時使用大小寫

這是我的功能,不計算'轉動'年齡;

CREATE OR REPLACE FUNCTION agecalculator(i date) RETURNS integer AS $$ 
    BEGIN 
      RETURN EXTRACT(YEAR FROM NOW()) - EXTRACT(YEAR FROM i); 
    END; 
$$ LANGUAGE plpgsql; 

這就是我想讓它工作來檢查一個人的Bday是否通過;

CREATE OR REPLACE FUNCTION agecalculator(i date) RETURNS integer AS $$ 
    DECLARE age integer; 
    BEGIN 
      age = EXTRACT(YEAR FROM NOW()) - EXTRACT(YEAR FROM i) - 1; 
      SET age = CASE 
      WHEN now_month = i_month AND now_day <= i_day 
      THEN age = age + 1 
      WHEN now_month < i_month 
      THEN age = age + 1 
      END; 
      RETURN age; 
    END; 
$$ LANGUAGE plpgsql; 

SQL爲什麼如此難以預測?先謝謝你!

+0

有什麼不對的'年齡()'函數?但是在生成變量時,使用PL/pgSQL中的'x:= ..'而不是'set'來分配。你也沒有聲明變量'now_month'' i_month'和'now_day' –

回答

0

試試這個

CREATE OR REPLACE FUNCTION agecalculator(i date) RETURNS integer AS $$ 
    DECLARE age integer; 
      now_month integer; 
      now_day integer; 
      i_month integer; 
      i_day integer; 
    BEGIN 
      now_month := date_part('month',now()); 
      now_day := date_part('day',now()); 
      i_month := date_part('month',i); 
      i_day := date_part('day',i); 

      age = EXTRACT(YEAR FROM NOW()) - EXTRACT(YEAR FROM i) - 1; 
      age := CASE WHEN now_month = i_month AND now_day <= i_day 
         THEN age + 1 
         WHEN now_month < i_month 
         THEN age + 1 
        END; 
      RETURN age; 
    END; 
$$ LANGUAGE plpgsql; 
相關問題