คราวนี้เรามดูการเปลี่ยน date เป็น “การนำข้อมูลออก” (Output/Display) กันบ้าง เพราะบ่อยครั้งที่ข้อมูลในฐานะข้อมูลเก็บถูกต้องแล้ว แต่เวลา Select ออกมาโชว์หน้าเว็บหรือ Report กลับได้รูปแบบที่ไม่ต้องการ เช่น อยากได้ 31/01/2020 แต่ได้ 2020-01-31 00:00:00.000 ผู้ใช้บางส่วนจะอ่านข้อมูลได้ยาก หรือว่ามีข้อมูลเกินจำเป็น โดยที่คนส่วนใหญ่จะแยกเวลาหลังนาทีไม่ได้ การใช้ convert หรือ format จะเป็นการที่ทำให้ยูเซอร์ใช้งานง่ายขึ้น
คู่มือการใช้ CONVERT ใน SQL Server: เปลี่ยนวันที่ให้แสดงผลได้ดั่งใจ
สิ่งหนึ่งที่ Developer มือใหม่มักเข้าใจผิดคือ “คิดว่าวันที่ใน Database มีรูปแบบ (Format)” ความเป็นจริงคือ SQL Server เก็บวันที่เป็นตัวเลข (Binary) มันไม่มีหน้าตาครับ แต่ที่เราเห็นเป็น YYYY-MM-DD ตอนกด Select นั่นคือโปรแกรมมันแสดงผล Default ให้เราดู ถ้าเราอยากเปลี่ยนหน้าตาของวันที่เพื่อนำไปแสดงผลใน Report หรือ Application เราต้องใช้คำสั่ง CONVERT ครับ
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
- data_type: ส่วนใหญ่เราจะแปลงเป็น
VARCHAR หรือ NVARCHAR เพื่อให้เป็นข้อความ
- expression: คือคอลัมน์วันที่ หรือค่าวันที่ที่ต้องการแปลง
- style: (จุดเด่นต่างจาก CASR) คือ “รหัสตัวเลข” ที่กำหนดว่าอยากได้หน้าตาแบบไหน
รหัส Style ยอดนิยมที่ต้องจำ (Cheat Sheet)
แม้จะมีรหัสมากมาย แต่ในการทำงานจริง เราใช้กันอยู่ไม่กี่ตัวครับ โดยแบ่งเป็นกลุ่มหลักๆ ดังนี้ (ผมแนะนำให้ใช้กลุ่มที่ +100 เสมอ เพื่อให้ปีเป็น ค.ศ. 4 หลัก YYYY ครับ)
| รหัส Style | รูปแบบ (Format) | ตัวอย่างผลลัพธ์ | การใช้งาน |
|---|
| 103 | dd/mm/yyyy | 31/01/2020 | นิยมที่สุดในไทย/UK |
| 101 | mm/dd/yyyy | 01/31/2020 | รูปแบบ US |
| 120 | yyyy-mm-dd hh:mi:ss | 2020-01-31 14:30:00 | มาตรฐาน ODBC / สากล |
| 112 | yyyymmdd | 20200131 | ใช้ทำ ID หรือ Sorting |
Note: หากใช้รหัสเลขหลักเดียว (เช่น 3, 1, 20) ปีจะแสดงแค่ 2 หลัก (YY) ซึ่งไม่แนะนำให้ใช้ในปัจจุบันครับ
ตัวอย่างการใช้งานจริง
- แปลงเป็นแบบไทยๆ (วัน/เดือน/ปี)
SELECT CONVERT(VARCHAR, GETDATE(), 103);
— ผลลัพธ์: 31/01/2020
- ตัดเอาแค่เวลา (Time Only)
SELECT CONVERT(VARCHAR(5), GETDATE(), 108);
— ผลลัพธ์: 14:30 (กำหนด length เป็น 5 เพื่อตัดวินาทีทิ้ง)
- สร้าง Running Number จากวันที่
SELECT CONVERT(VARCHAR, GETDATE(), 112) + REPLACE(CONVERT(VARCHAR(8), GETDATE(), 108), ':', '');
— ผลลัพธ์: 20200131143000 (ปีเดือนวันชั่วโมงนาทีวินาที)
ข้อควรระวังระดับ Pro (Performance Tips)
- ระวังการใช้ใน WHERE Clause
หลีกเลี่ยงการใช้ CONVERT กับคอลัมน์ในเงื่อนไข WHERE เพราะจะทำให้ Index ทำงานไม่ได้ (Non-SARGable)
- ❌ ไม่ควรทำ: (ระบบต้องแปลงข้อมูลทุกแถวมาเทียบ ทำให้ช้า)
WHERE CONVERT(VARCHAR, OrderDate, 112) = '20200131'
- ✅ ควรทำ: (เทียบช่วงเวลา เพื่อให้ใช้ Index ได้)
WHERE OrderDate >= '2020-01-31 00:00:00' AND OrderDate < '2020-02-01 00:00:00'
- CONVERT vs FORMAT
ใน SQL Server เวอร์ชันใหม่ๆ (2012+) จะมีฟังก์ชัน FORMAT() มาให้ใช้ ซึ่งเขียนง่ายกว่ามาก เช่น FORMAT(GETDATE(), 'dd/MM/yyyy')
- ✅ ข้อดี FORMAT: จำง่าย ยืดหยุ่น เหมือนเขียน C#
- ❌ ข้อเสีย FORMAT: ทำงานช้ากว่า CONVERT มาก หากข้อมูลมีจำนวนมหาศาล (หลักล้าน rows) แนะนำให้ใช้
CONVERT เหมือนเดิมครับ
สรุป
- SET DATEFORMAT: ใช้จัดการขาเข้า (Input) เพื่อไม่ให้ Error
- CONVERT: ใช้จัดการขาออก (Output) เพื่อความสวยงาม
- รหัส 103: คือเพื่อนรักของ Developer ไทย (dd/mm/yyyy)
- รหัส 120: คือมาตรฐานสากล
อ่านเพิ่มเติม