PostgreSQL:PostgreSQL 支持波斯历吗?

问题描述 投票:0回答:2

Oracle 支持波斯历,但需要知道 PostgreSQL 是否支持波斯历?

如果是,那么我们如何在 PostgreSQL 中将默认日历类型设置为波斯语而不是公历(在 Oracle 中我们可以使用 NLS_CALENDAR 来设置默认日历)。

提前致谢!

postgresql calendar persian
2个回答
3
投票

不可以,PostgreSQL 仅支持公历,对儒略日期系统有一定支持。


0
投票

不,试试这个:

CREATE OR REPLACE Function miladi_to_shamsi(p_date TIMESTAMP(3),p_res_type INT=1)

RETURNS VARCHAR(50)

AS $$

DECLARE v_shYear INT ;v_shMonth INT ;v_shDay INT  ;v_intMM INT ;v_intDD INT ;v_Kabiseh1 INT ;v_Kabiseh2 INT ;v_d1 INT ;v_m1 INT; v_shMaah TEXT;v_shRooz TEXT;v_DayCnt INT;

 v_DayDate TEXT;
 v_intYY INT:= DATE_PART('year', p_date);
BEGIN


IF v_intYY < 1000 THEN v_intYY := v_intYY + 2000;
END IF;

v_intMM := EXTRACT(MONTH FROM p_date);
v_intDD := EXTRACT(DAY FROM p_date);
v_shYear := v_intYY - 622;
v_DayCnt := date_part('dow', CAST('01/02/' ||  CAST(  v_intYY AS CHAR(4))as TIMESTAMP ));
v_m1 := 1;
v_d1 := 1;
v_shMonth := 10;
v_shDay := 11;


IF ( ( v_intYY - 1993 ) % 4 = 0 ) THEN v_shDay := 12;
END IF;


WHILE ( v_m1 != v_intMM ) OR ( v_d1 != v_intDD )

LOOP


  v_d1 := v_d1 + 1;

  v_DayCnt := v_DayCnt + 1;


  IF ( ( v_intYY - 1992 ) % 4 = 0) THEN v_Kabiseh1 := 1; ELSE v_Kabiseh1 := 0;
  END IF;


  IF ( ( v_shYear - 1371 ) % 4 = 0) THEN v_Kabiseh2 := 1; ELSE v_Kabiseh2 := 0;
  END IF;


  IF 

  (v_d1 = 32 AND (v_m1 = 1 OR v_m1 = 3 OR v_m1 = 5 OR v_m1 = 7 OR v_m1 = 8 OR v_m1 = 10 OR v_m1 = 12))

  OR

  (v_d1 = 31 AND (v_m1 = 4 OR v_m1 = 6 OR v_m1 = 9 OR v_m1 = 11))

  OR

  (v_d1 = 30 AND v_m1 = 2 AND v_Kabiseh1 = 1)

  OR

  (v_d1 = 29 AND v_m1 = 2 AND v_Kabiseh1 = 0)

  THEN

    v_m1 := v_m1 + 1;

    v_d1 := 1;

  END IF;


  IF v_m1 > 12

  THEN

    v_intYY := v_intYY + 1;

    v_m1 := 1;

  END IF;

  

  IF v_DayCnt > 7 THEN v_DayCnt := 1;
  END IF;


 v_shDay := v_shDay + 1;

  

  IF

  (v_shDay = 32 AND v_shMonth < 7)

  OR

  (v_shDay = 31 AND v_shMonth > 6 AND v_shMonth < 12)

  OR

  (v_shDay = 31 AND v_shMonth = 12 AND v_Kabiseh2 = 1)

  OR

  (v_shDay = 30 AND v_shMonth = 12 AND v_Kabiseh2 = 0)

  THEN

    v_shMonth := v_shMonth + 1;

    v_shDay := 1;

  END IF;


  IF v_shMonth > 12

  THEN

    v_shYear := v_shYear + 1;

    v_shMonth := 1;

  END IF;

  

END LOOP;


IF p_res_type>1 THEN
    IF v_shMonth=1 THEN 
    v_shMaah:='فروردین';
    ELSEIF v_shMonth=2 THEN 
    v_shMaah:='اردیبهشت';
    ELSEIF v_shMonth=3 THEN 
    v_shMaah:='خرداد';
    ELSEIF v_shMonth=4 THEN
     v_shMaah:='تیر';
    ELSEIF v_shMonth=5 THEN 
    v_shMaah:='مرداد';
    ELSEIF v_shMonth=6 THEN 
    v_shMaah:='شهریور';
    ELSEIF v_shMonth=7 THEN 
    v_shMaah:='مهر';
    ELSEIF v_shMonth=8 THEN 
    v_shMaah:='آبان';
    ELSEIF v_shMonth=9 THEN 
    v_shMaah:='آذر';
    ELSEIF v_shMonth=10 THEN 
    v_shMaah:='دی';
    ELSEIF v_shMonth=11 THEN 
    v_shMaah:='بهمن';
    ELSEIF v_shMonth=12 THEN 
    v_shMaah:='اسفند';
    END IF;
    v_DayCnt := date_part('isodow', p_date);
    IF v_DayCnt=6 THEN 
    v_shRooz:='شنبه';
    ELSEIF v_DayCnt=7 THEN 
    v_shRooz:='یکشنبه';
    ELSEIF v_DayCnt=1 THEN 
    v_shRooz:='دوشنبه';
    ELSEIF v_DayCnt=2 THEN 
    v_shRooz:='سه‌شنبه';
    ELSEIF v_DayCnt=3 THEN 
    v_shRooz:='چهارشنبه';
    ELSEIF v_DayCnt=4 THEN 
    v_shRooz:='پنجشنبه';
    ELSEIF v_DayCnt=5 THEN 
    v_shRooz:='جمعه';
    END IF;
END IF;


IF p_res_type=1 --1403/01/14    
THEN
    v_DayDate := TO_CHAR(v_shYear, 'FM0000') || '/'|| TO_CHAR(v_shMonth, 'FM00') || '/' || TO_CHAR(v_shDay, 'FM00');

ELSEIF p_res_type=2 --سه‌شنبه 14 فروردین 1403       
THEN
    v_DayDate := v_shRooz || ' ' ||  TO_CHAR(v_shDay, 'FM00') || ' ' || v_shMaah || ' ' || TO_CHAR(v_shYear, 'FM0000');

ELSEIF p_res_type=3 --17اردیبهشت 1394
THEN
    v_DayDate := v_shDay || v_shMaah ||  TO_CHAR(v_shYear, 'FM0000');
    
ELSEIF p_res_type=4 --1403/1/14T19:18:20    
THEN
    v_DayDate :=  TO_CHAR(v_shYear, 'FM0000')||'/'|| TO_CHAR(v_shMonth, 'FM00') ||'/'|| TO_CHAR(v_shDay, 'FM00') ||'T'||CAST(p_date AS TIME);
    
ELSEIF p_res_type=5 --14030114  
THEN
    v_DayDate := TO_CHAR(v_shYear, 'FM0000') || TO_CHAR(v_shMonth, 'FM00') ||  TO_CHAR(v_shDay, 'FM00');
END IF;
RETURN v_DayDate;

END;
$$ LANGUAGE plpgsql;
© www.soinside.com 2019 - 2024. All rights reserved.