Saturday, May 2, 2009

วันที่กับ Oracle

ข้อเขียนนี้ช่วยฉัน: 
Updated: 8/6/2008

มักจะมีคนถามบ่อย ๆ ว่า Oracle เก็บวันที่เป็นปีฝรั่งหรือปีไทย จริงๆ แล้วฟิลด์ DATE ของ Oracle จะเก็บข้อมูลวันที่เป็นตัวเลขค่าหนึ่งซึ่งแทนวันที่ในปฏิทินสากลแบบแบบของฝรั่งเขา ซึ่งเรียกว่าปฏิทินแบบ Gregorian ซึ่งเป็นปฏิทินแบบ default ของ Oracle การเก็บจึงไม่ใช่การเก็บเป็นตัวเลข 2551 หรือ 2008 ดังนั้นคำถามจึงไม่ได้อยู่ที่ว่ามันเก็บเป็นปีฝรั่งหรือปีไทย แต่น่าจะอยู่ที่ว่าคุณยินดีจะคีย์วันที่เป็นปีไทยหรือปีฝรั่งคุณก็คีย์ แต่บอก Oracle หน่อยว่าที่คุณคีย์นั้นเอาฟอร์แมตแบบไหน เป็นปีไทยหรือปีฝรั่ง การนำออกมาแสดงก็เช่นกัน ตอนคุณเอาออกมาแสดงก็เพียงแต่บอกว่าต้องการดูแบบปีไทยหรือปีฝรั่ง ในตัวอย่างผมเปลี่ยนประเภทของปฏิทินเป็นแบบปีพ.ศ. (THAI_BUDDHA) แล้ว insert ข้อมูลเข้าไปเป็นทั้งปีแบบ ค.ศ. และ พ.ศ. แล้วก็เปลี่ยนกลับเป็นแบบปี ค.ศ. (GREGORIAN) จะเห็นว่า เมื่อเรา insert ปีพ.ศ.เข้าไปในขณะที่เราตั้งปฏิทินเป็นปี พ.ศ. เมื่อ select ข้อมูลขึ้นมาก็จะได้ข้อมูลที่ถูกต้อง แต่ถ้าเรา insert ปีค.ศ.เข้าไปเราจะเห็นว่า กันจะกลายเป็นปี พ.ศ.2008 แทน เช่นเดียวกับเมื่อเราตั้งปฏิทินเป็นแบบ ค.ศ. แล้วคีย์ข้อมูลเป็น 2551 เราก็จะได้ปี ค.ศ.2551
ตอนท้ายผม select ข้อมูลที่เรา insert เข้าไปให้ดูในทั้งสองแบบปฏิทิน หวังว่าคงจะช่วยทำให้เข้าใจเรื่องปฏิทินใน Oracle ดีขึ้นมั่งนะครับ

SQL> create table mydate (date_col date);

Table created.

SQL> alter session set nls_calendar = 'THAI BUDDHA';

Session altered.

SQL> insert into mydate values (to_date ('15/12/2008','dd/mm/yyyy'));

1 row created.

SQL> insert into mydate values (to_date ('15/12/2551','dd/mm/yyyy'));

1 row created.

SQL> alter session set nls_calendar = 'GREGORIAN';

Session altered.

SQL> insert into mydate values (to_date ('15/12/2008','dd/mm/yyyy'));

1 row created.

SQL> insert into mydate values (to_date ('15/12/2551','dd/mm/yyyy'));

1 row created.

SQL> commit;

Commit complete.

SQL> conn scott/tiger
Connected.
SQL> select * from mydate;

DATE_COL
-------------
15 ธ.ค. 1465
15 ธ.ค. 2008
15 ธ.ค. 2008
15 ธ.ค. 2551

SQL> alter session set nls_calendar='THAI BUDDHA';

Session altered.

SQL> select * from mydate;

DATE_COL
--------------------------------------------------------
วันที่ 15 ธันวาคม พุทธศักราช 2008
วันที่ 15 ธันวาคม พุทธศักราช 2551
วันที่ 15 ธันวาคม พุทธศักราช 2551
วันที่ 15 ธันวาคม พุทธศักราช 3094

No comments:

Post a Comment