MySQL เก็บวันที่ในรูปแบบ YYYY-MM-DD (ISO 8601) แต่การแสดงผลให้ผู้ใช้มักต้องการรูปแบบ DD/MM/YYYY ใช้ DATE_FORMAT() สำหรับการแสดงผล และ STR_TO_DATE() สำหรับการแปลงข้อความเข้า DB
1. แสดงผล (SELECT) - ใช้ DATE_FORMAT()
SELECT DATE_FORMAT(yourDateColumn, '%d/%m/%Y') AS formatted_date
FROM yourTableName;
2. แปลงข้อความเข้า DB (INSERT/UPDATE) - ใช้ STR_TO_DATE()
INSERT INTO yourTableName (date_col)
VALUES (STR_TO_DATE('26/11/2018', '%d/%m/%Y'));
ตัวอย่างสมบูรณ์
สร้างตารางเก็บวันที่เป็น VARCHAR (จำลองข้อมูลนำเข้า)
mysql> CREATE TABLE DateFormatDemo (IssueDate VARCHAR(100));
Query OK, 0 rows affected (0.54 sec)
mysql> INSERT INTO DateFormatDemo VALUES
-> ('26/11/2018'), ('27/11/2018'), ('2/12/2018'), ('3/12/2018');
ดูข้อมูลดิบ
mysql> SELECT * FROM DateFormatDemo;
+------------+
| IssueDate |
+------------+
| 26/11/2018 |
| 27/11/2018 |
| 2/12/2018 |
| 3/12/2018 |
+------------+
4 rows in set (0.00 sec)
แปลงเป็น DATE ด้วย STR_TO_DATE
mysql> SELECT STR_TO_DATE(IssueDate, '%d/%m/%Y') AS StringToDateFormatExample
-> FROM DateFormatDemo;
+---------------------------+
| StringToDateFormatExample |
+---------------------------+
| 2018-11-26 |
| 2018-11-27 |
| 2018-12-02 |
| 2018-12-03 |
+---------------------------+
4 rows in set (0.00 sec)
แสดงผลเป็น DD/MM/YYYY ด้วย DATE_FORMAT
mysql> SELECT DATE_FORMAT(STR_TO_DATE(IssueDate, '%d/%m/%Y'), '%d/%m/%Y') AS ThaiFormat
-> FROM DateFormatDemo;
+------------+
| ThaiFormat |
+------------+
| 26/11/2018 |
| 27/11/2018 |
| 02/12/2018 |
| 03/12/2018 |
+------------+
4 rows in set (0.00 sec)
รูปแบบวันที่ไทยที่นิยม
| รูปแบบ | Format String | ตัวอย่าง |
|---|---|---|
| DD/MM/YYYY | %d/%m/%Y | 26/11/2018 |
| D/M/YYYY | %e/%c/%Y | 26/11/2018 |
| DD-MM-YYYY | %d-%m-%Y | 26-11-2018 |
| DD MMM YYYY | %d %b %Y | 26 Nov 2018 |
| วัน DD เดือน MMMM ปี YYYY | ต้องใช้ CASE/ELT | วันจันทร์ที่ 26 พฤศจิกายน 2561 |
แปลงเป็น พ.ศ. (Buddhist Era)
SELECT DATE_FORMAT(date_col, '%d/%m/%Y') AS AD_Date,
CONCAT(DATE_FORMAT(date_col, '%d/%m/'), YEAR(date_col) + 543) AS BE_Date
FROM your_table;
Best Practice
- เก็บใน DB เป็น
DATE/DATETIME(ISO Format) - แปลงรูปแบบเฉพาะตอนแสดงผล (Presentation Layer)
- Application Layer ควรทำ Formatting แทน DB (ยกเว็กรายงาน直由 DB)