Oracle 支持波斯历,但需要知道 PostgreSQL 是否支持波斯历?
如果是,那么我们如何在 PostgreSQL 中将默认日历类型设置为波斯语而不是公历(在 Oracle 中我们可以使用 NLS_CALENDAR 来设置默认日历)。
提前致谢!
不可以,PostgreSQL 仅支持公历,对儒略日期系统有一定支持。
不,试试这个:
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;