ปัญหา
DATE_FORMAT(NULL, ...) คืน NULL แล้ว แต่บางครั้งต้องการควบคุมให้ชัดเจน หรือใช้ใน expression ที่ซับซ้อน
วิธีแก้: ใช้ IF() หรือ CASE WHEN
รูปแบบคำสั่ง
SELECT IF(yourDateColumn, DATE_FORMAT(yourDateColumn, '%d/%m/%Y'), NULL) FROM yourTableName;
ตัวอย่างครบถ้วน
1. สร้างตารางมี NULL ปน
mysql> create table returnNullWhenInputIsNullDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ShippingDate datetime
-> );
Query OK, 0 rows affected (1.21 sec)
2. เพิ่มข้อมูล (มี NULL 3 แถว)
mysql> insert into returnNullWhenInputIsNullDemo(ShippingDate) values('2019-01-21');
Query OK, 1 row affected (0.37 sec)
mysql> insert into returnNullWhenInputIsNullDemo(ShippingDate) values(NULL);
Query OK, 1 row affected (0.16 sec)
mysql> insert into returnNullWhenInputIsNullDemo(ShippingDate) values('2018-03-25');
Query OK, 1 row affected (0.17 sec)
mysql> insert into returnNullWhenInputIsNullDemo(ShippingDate) values(NULL);
Query OK, 1 row affected (0.17 sec)
mysql> insert into returnNullWhenInputIsNullDemo(ShippingDate) values(NULL);
Query OK, 1 row affected (0.10 sec)
mysql> insert into returnNullWhenInputIsNullDemo(ShippingDate) values('2012-04-23');
Query OK, 1 row affected (0.20 sec)
mysql> insert into returnNullWhenInputIsNullDemo(ShippingDate) values('2018-12-01');
Query OK, 1 row affected (0.23 sec)
mysql> insert into returnNullWhenInputIsNullDemo(ShippingDate) values('2016-11-13');
Query OK, 1 row affected (0.13 sec)
3. ดูข้อมูลดิบ
mysql> select * from returnNullWhenInputIsNullDemo;
+----+---------------------+ | Id | ShippingDate | +----+---------------------+ | 1 | 2019-01-21 00:00:00 | | 2 | NULL | | 3 | 2018-03-25 00:00:00 | | 4 | NULL | | 5 | NULL | | 6 | 2012-04-23 00:00:00 | | 7 | 2018-12-01 00:00:00 | | 8 | 2016-11-13 00:00:00 | +----+---------------------+
4. IF() ควบคุม NULL
mysql> SELECT IF(ShippingDate, DATE_FORMAT(ShippingDate, '%d/%m/%Y'), NULL)
-> FROM returnNullWhenInputIsNullDemo;
+-------------------------------------------------------------+ | IF(ShippingDate, DATE_FORMAT(ShippingDate, '%d/%m/%Y'), NULL) | +-------------------------------------------------------------+ | 21/01/2019 | | NULL | | 25/03/2018 | | NULL | | NULL | | 23/04/2012 | | 01/12/2018 | | 13/11/2016 | +-------------------------------------------------------------+
วิธีอื่น: CASE WHEN (มาตรฐาน ANSI SQL)
SELECT CASE
WHEN ShippingDate IS NOT NULL THEN DATE_FORMAT(ShippingDate, '%d/%m/%Y')
ELSE NULL
END AS formatted_date
FROM returnNullWhenInputIsNullDemo;
COALESCE สำหรับ Default Value
-- ถ้า NULL ให้แสดง 'N/A' แทน SELECT COALESCE(DATE_FORMAT(ShippingDate, '%d/%m/%Y'), 'N/A') FROM returnNullWhenInputIsNullDemo;
+----------------------------------------------------------+ | COALESCE(DATE_FORMAT(ShippingDate, '%d/%m/%Y'), 'N/A') | +----------------------------------------------------------+ | 21/01/2019 | | N/A | | 25/03/2018 | | N/A | | N/A | | 23/04/2012 | | 01/12/2018 | | 13/11/2016 | +----------------------------------------------------------+
NULLIF สำหรับค่าพิเศษ
-- ถ้า date เป็น '1970-01-01' (epoch) ให้คืน NULL SELECT NULLIF(DATE_FORMAT(ShippingDate, '%d/%m/%Y'), '01/01/1970') FROM table;
Performance: Generated Column (MySQL 5.7+)
ALTER TABLE t ADD COLUMN formatted_date VARCHAR(20) GENERATED ALWAYS AS (IF(ShippingDate, DATE_FORMAT(ShippingDate, '%d/%m/%Y'), NULL)) STORED;
คำนวณอัตโนมัติตอน INSERT/UPDATE index ได้ query เร็ว
สรุป: IF(date_col, DATE_FORMAT(...), NULL) ควบคุม NULL behavior ได้ชัดเจนใน MySQL