Category Archive T-SQL

Byphunsanit

SQL Server: CAST และ CONVERT

ใน SQL Server ทั้ง CAST และ CONVERT มีหน้าที่หลักเหมือนกันคือ การแปลงชนิดของข้อมูล (Data Type) จากชนิดหนึ่งไปเป็นอีกชนิดหนึ่ง (เช่น แปลงตัวเลขเป็นข้อความ หรือแปลงวันที่เป็นข้อความ)
แต่ทั้งสองคำสั่งนี้มีจุดที่แตกต่างกันสำคัญ ๆ รวมถึงเรื่องอย่าง performance และ portability

คุณสมบัติCASTCONVERT
มาตรฐานเป็นมาตรฐาน ANSI SQL (ใช้ได้กับฐานข้อมูลอื่นด้วย)เป็นคำสั่งเฉพาะของ SQL Server (T-SQL)
การจัดรูปแบบ (Formatting)ทำไม่ได้ (แปลงแบบพื้นฐานเท่านั้น)ทำได้ดีมาก (โดยเฉพาะกับ Date/Time)
ไวยากรณ์ (Syntax)จำง่าย ตรงไปตรงมาซับซ้อนกว่าเล็กน้อย มี parameters เพิ่ม
ประสิทธิภาพใกล้เคียงกันมากใกล้เคียงกันมาก

CAST (มาตรฐานสากล)

CAST เป็นคำสั่งที่เป็นมาตรฐาน ANSI หมายความว่าถ้าคุณเขียน Query นี้ แล้ววันหนึ่งต้องย้ายไปใช้ฐานข้อมูลอื่น (เช่น MySQL, PostgreSQL, Oracle) คุณมักจะใช้ไวยากรณ์เดิมได้โดยไม่ต้องแก้โค้ด

  • Syntax: CAST(expression AS data_type)
  • จุดเด่น: อ่านง่าย เขียนสั้น เหมาะสำหรับการแปลงค่าธรรมดาที่ไม่ต้องการจัดรูปแบบพิเศษ

ตัวอย่าง:
— แปลงตัวเลข 123.45 เป็นจำนวนเต็ม (Integer)
SELECT CAST(123.45 AS INT);
— ผลลัพธ์: 123


CONVERT (เก่งเรื่อง Format)

CONVERT เป็นฟังก์ชันเฉพาะของ SQL Server มีความยืดหยุ่นสูงกว่า เพราะมี parameter ตัวที่ 3 ที่เรียกว่า Style ซึ่งช่วยกำหนดรูปแบบการแสดงผลได้ โดยเฉพาะเรื่อง วันที่ (Date)

  • Syntax: CONVERT(data_type, expression, [style])
  • จุดเด่น: สามารถกำหนดหน้าตาของข้อมูลที่แปลงออกมาได้ (เช่น อยากได้วันที่แบบ dd/mm/yyyy หรือ mm-dd-yy)

ตัวอย่าง:
— แปลงวันที่ปัจจุบัน เป็นข้อความ โดยระบุ Style 103 (British/French standard)
SELECT CONVERT(VARCHAR, GETDATE(), 103);
— ผลลัพธ์: 08/01/2026 (รูปแบบ dd/mm/yyyy)
— ถ้าใช้ CAST จะเลือก Format ไม่ได้ (จะได้ค่า Default)
SELECT CAST(GETDATE() AS VARCHAR);
— ผลลัพธ์: Jan 8 2026 12:09AM


สรุป: ควรใช้อันไหนดี?

  • ใช้ CAST เป็นหลัก:
    • หากคุณแค่ต้องการแปลง Type ข้อมูลปกติ (เช่น int -> varchar) แนะนำให้ใช้ CAST เพราะเป็นมาตรฐานสากลและอ่านง่ายกว่า
    • ถ้าอาจจะมีการเปลี่ยน database ควรใช้ เพราะมีความเป็นมาตราฐาน ง่ายต่อการเปลี่ยนแปลง (portability)
  • ใช้ CONVERT เมื่อต้องการจัด Format: หากคุณต้องการแปลง วันที่ (Date/Time) ออกมาเป็นข้อความในรูปแบบที่ต้องการ (เช่น ต้องการแสดงผลใน Report เป็น วว/ดด/ปปปป) คุณจำเป็นต้องใช้ CONVERT

ข้อควรระวัง: ทั้งคู่จะ Error หากข้อมูลนั้นแปลงไม่ได้จริง (เช่น พยายามแปลงคำว่า “Hello” เป็นตัวเลข) หากต้องการป้องกัน Error แนะนำให้ลองศึกษา TRY_CAST หรือ TRY_CONVERT ซึ่งจะคืนค่าเป็น NULL แทน Error ครับ


อ่านเพิ่มเติม