หลาย ๆ คนคงเคยเจอปัญหาว่าฐานข้อมูลของเรากำหนด default การจัดเก็บข้อมูลวันที่ไว้เป็นปี ค.ศ. แต่ระบบที่เราพัฒนาต้องแสดงผลเป็นปี พ.ศ. เราต้องทำอย่างไร วันนี้จึงขอนำเสนอวิธีการแสดงผลวันที่เป็นภาษาที่เราต้องการด้วยฟังก์ชัน TO_CHAR กันค่ะ
โดยที่ฟังก์ชัน TO_CHAR ทำหน้าที่ในการแปลงข้อมูลตัวเลขและข้อมูลวันที่เป็นตัวอักษร ซึ่งมีรูปแบบ Syntax ดังนี้
TO_CHAR(input_value,[format_mask],[nls_parameter])
พารามิเตอร์ของฟังก์ชัน TO_CHAR คือ
- input_value (จำเป็น): ค่าของวันที่ที่ต้องการจะแปลงค่า
- format_mask (ทางเลือก): เป็นรูปแบบที่ต้องการให้แสดง หากไม่ได้ระบุไว้จะแสดงตามค่า default ที่กำหนดไว้
- nls_parameter (ทางเลือก): เป็น nls language ที่จะใช้ในการแปลงค่า
ต่อไปนี้เป็นตัวอย่าง format_mask ที่ใช้บ่อย ๆ โดยแต่ละ format_mask สามารถนำผสมรวมกันได้ เพื่อให้ได้ค่าการแสดงผลที่เราต้องการ
| format_mask | คำอธิบาย |
| YEAR | อ่านค่าปีเป็นตัวอักษร |
| YYYY, YYY, YY, Y | แสดงจำนวนหลักสุดท้ายของปีตามที่ระบุ |
| MM | แสดงเดือน (01-12, JAN = 01) |
| MON | แสดงชื่อเดือนแบบย่อ |
| MONTH | แสดงชื่อเดือนแบบเต็ม |
| D | แสดงวันในสัปดาห์ |
| DAY | แสดงชื่อของวัน |
| DD | แสดงวันของเดือน (1-31) |
| DDD | แสดงวันของปี (1-366) |
| DY | แสดงชื่อย่อของวัน |
| HH | แสดงชั่วโมงของวัน (1-12) |
| HH12 | แสดงชั่วโมงของวัน (1-12) |
| HH24 | แสดงชั่วโมงของวัน (0-23) |
| MI | แสดงนาที (0-59) |
| SS | แสดงวินาที (0-59) |
คราวนี้ลองมาเขียน query เพื่อดูตัวอย่างค่าของ format_mask แต่ละตัวกันว่าจะแสดงผลออกมาเป็นอย่างไร


จะเห็นว่าค่าวันที่ที่แสดง แสดงเป็นปี ค.ศ. ตาม default ของฐานข้อมูล สังเกตุว่าข้อมูลบาง format_mask จะมีค่าศูนย์นำหน้า และมีช่องว่างตามหลัง ดังนั้นถ้าต้องการตัดเลขศูนย์และช่องว่างเราสามารถใช้ “FM” นำหน้า format_mask ตามตัวอย่างต่อไปนี้


คราวนี้ถ้าเราต้องการที่จะให้การแสดงผลวันที่เป็นวัน เดือน ปี ไทย เราสามารถใช้ nls_parameter เข้ามาช่วยได้โดยสามารถกำหนดได้ตามตัวอย่างข้างล่างนี้


ตัวแปรที่สำคัญคือ
– NLS_CALENDAR ตัวนี้แหละที่ทำให้ พ.ศ. แสดงเป็น พุทธศักราช 2562 (THAI BUDDHA)
– NLS_DATE_LANGUAGE ตัวนี้กำหนดให้แสดงเดือนเป็นภาษาไทย (THAI)
ด้วยตัวพารามิเตอร์ NLS_CALENDAR และ NLS_DATE_LANGUAGE เราก็สามารถแสดงผลเป็น ภาษาอะไรก็ได้ตามที่เราต้องการ

Leave a Reply