วันเสาร์ที่ 26 กุมภาพันธ์ พ.ศ. 2554

PostgreSQL กับ วันเดือนปี ของไทย ( Date Time and Thai Localization for PostgreSQL/PostGIS)

ในการพัฒนาฐานข้อมูล เช่น PostgreSQL/PostGIS หากต้องการจัดเก็บวันเวลา ควรใช้เวลาสากล เช่น timestamp with time zone แต่เวลาแสดงผล ต้องเป็นแบบไทยๆ ผมมีฟังก์ชันช่วยงานดังนี้
ชื่อวันของสัปดาห์ ชื่อเดือน ปีพศ ให้ใช้ฟังก์ชัน PS_Day(), PS_Month(), PS_Year()

----------------------------------------------------------------------

-- Function: "PS_Day"(timestamp with time zone, boolean)

-- DROP FUNCTION "PS_Day"(timestamp with time zone, boolean);

CREATE OR REPLACE FUNCTION "PS_Day"(datetime timestamp with time zone, thai_lang boolean)
RETURNS text AS
$BODY$
DECLARE
a_text text;
BEGIN
IF thai_lang = TRUE THEN
a_text := to_char( datetime , 'TMDay' ); -- TM Translation Mode
ELSE
a_text := to_char( datetime , 'Day' );
END IF;
RETURN a_text;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION "PS_Day"(timestamp with time zone, boolean) OWNER TO postgres;
COMMENT ON FUNCTION "PS_Day"(timestamp with time zone, boolean) IS 'return THAI or english day of week';

------------------------------------------------------------------------

-- Function: "PS_Month"(timestamp with time zone, boolean)

-- DROP FUNCTION "PS_Month"(timestamp with time zone, boolean);

CREATE OR REPLACE FUNCTION "PS_Month"(datetime timestamp with time zone, thai_lang boolean)
RETURNS text AS
$BODY$
DECLARE
a_text text;
BEGIN
IF thai_lang = TRUE THEN
a_text := to_char( datetime , 'TMMonth' ); -- TM Translation Mode
ELSE
a_text := to_char( datetime , 'Month' );
END IF;
RETURN a_text;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION "PS_Month"(timestamp with time zone, boolean) OWNER TO postgres;
COMMENT ON FUNCTION "PS_Month"(timestamp with time zone, boolean) IS 'return THAI or english month';

-----------------------------------------------------------------------------

-- Function: "PS_Year"(timestamp with time zone, boolean)

-- DROP FUNCTION "PS_Year"(timestamp with time zone, boolean);

CREATE OR REPLACE FUNCTION "PS_Year"(datetime timestamp with time zone, thai_lang boolean)
RETURNS text AS
$BODY$DECLARE
year_int integer;
BEGIN
IF thai_lang = TRUE THEN
year_int := (EXTRACT(YEAR FROM datetime))::int+543 ;
ELSE
year_int := (EXTRACT(YEAR FROM datetime))::int ;
END IF;
RETURN CAST(year_int AS text);
END;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION "PS_Year"(timestamp with time zone, boolean) OWNER TO postgres;
COMMENT ON FUNCTION "PS_Year"(timestamp with time zone, boolean) IS 'return BE or AD from ''timesptamp''';

------------------------------------------------------------------------

ปล. ผม copy & paste รู้สึกว่ามัน indent ไม่ค่อยดี แต่โปรแกรมสั้น ไปเคาะเอาเองแล้วกันนะครับ
ลองดูนะครับ หากมีปัญหา เมลย์ถึงแล้วกันจะส่ง dump ไฟล์ไปให้
อ้อ อีกอย่าง ตอน CREATE DATABASE อย่าลืมระบุ
CREATE DATABASE "Your_DB_Name"
WITH OWNER = postgres
ENCODING = 'UTF8'
....
LC_COLLATE = 'Thai_Thailand.874'
LC_CTYPE = 'Thai_Thailand.874'
...
ครับ

1 ความคิดเห็น:

SC01 กล่าวว่า...

Select function ใช้งานยังไงครับ