เมื่อคอลัมน์เป็น TIMESTAMP หรือ DATETIME และต้องการเฉพาะส่วนวันที่ ให้ใช้ฟังก์ชัน DATE()
รูปแบบคำสั่ง
SELECT DATE(yourTimestampColumn) AS date_only FROM yourTableName;
ตัวอย่างการใช้งาน
1. สร้างตาราง TIMESTAMP Column
mysql> CREATE TABLE DateFromTimestamp (
-> ShippingDateTime TIMESTAMP
-> );
Query OK, 0 rows affected (0.60 sec)
2. เพิ่มข้อมูล Timestamp
mysql> INSERT INTO DateFromTimestamp VALUES ('2012-12-26 13:24:35');
mysql> INSERT INTO DateFromTimestamp VALUES ('2013-11-26 14:36:40');
mysql> INSERT INTO DateFromTimestamp VALUES ('2016-07-22 15:20:10');
mysql> INSERT INTO DateFromTimestamp VALUES ('2017-11-04 04:25:30');
3. ดูข้อมูลดิบ (มีเวลา)
mysql> SELECT * FROM DateFromTimestamp;
+---------------------+
| ShippingDateTime |
+---------------------+
| 2012-12-26 13:24:35 |
| 2013-11-26 14:36:40 |
| 2016-07-22 15:20:10 |
| 2017-11-04 04:25:30 |
+---------------------+
4 rows in set (0.00 sec)
4. ดึงเฉพาะวันที่
mysql> SELECT DATE(ShippingDateTime) AS OnlyDatePartFromTimestamp
-> FROM DateFromTimestamp;
+---------------------------+
| OnlyDatePartFromTimestamp |
+---------------------------+
| 2012-12-26 |
| 2013-11-26 |
| 2016-07-22 |
| 2017-11-04 |
+---------------------------+
4 rows in set (0.00 sec)
ฟังก์ชันแยกส่วนวันที่/เวลา
| ฟังก์ชัน | คืนค่า | ตัวอย่าง |
|---|---|---|
DATE(datetime) | วันที่ (YYYY-MM-DD) | 2018-11-26 |
TIME(datetime) | เวลา (HH:MM:SS) | 14:30:59 |
YEAR(date) | ปี | 2018 |
MONTH(date) | เดือน (1-12) | 11 |
DAY(date) | วันที่ (1-31) | 26 |
HOUR(time) | ชั่วโมง (0-23) | 14 |
MINUTE(time) | นาที (0-59) | 30 |
SECOND(time) | วินาที (0-59) | 59 |
ใช้ใน WHERE Clause (ระวัง Index)
-- ❌ ไม่ใช้ Index (Function on Column)
SELECT * FROM orders WHERE DATE(created_at) = '2024-01-15';
-- ✅ ใช้ Index ได้ (Range Query)
SELECT * FROM orders
WHERE created_at >= '2024-01-15'
AND created_at < '2024-01-16';
CAST Alternative
SELECT CAST(ShippingDateTime AS DATE) FROM DateFromTimestamp;
-- ผลลัพธ์เหมือน DATE()
TIMESTAMP vs DATETIME
TIMESTAMP: เก็บเป็น UTC, แปลงตาม Timezone ของ Session, ช่วง 1970-2038, 4 bytesDATETIME: เก็บตามที่ใส่, ไม่แปลง Timezone, ช่วง 1000-9999, 8 bytes (5.6+: 5 bytes)- ทั้งคู่ใช้
DATE()ได้เหมือนกัน