เมื่อมีค่า Unix Timestamp (วินาทีนับจาก Epoch: 1970-01-01 00:00:00 UTC) ที่เก็บเป็น INT หรือ BIGINT ให้ใช้ FROM_UNIXTIME() แปลงเป็น DATETIME
รูปแบบคำสั่ง
SELECT FROM_UNIXTIME(yourIntColumn, '%Y-%m-%d %H:%i:%s') AS datetime_value
FROM yourTableName;
Parameter ที่ 2 (Format) เป็น Optional หากละเว้นจะได้ DATETIME แบบเต็ม
ตัวอย่างการใช้งาน
1. สร้างตารางเก็บ Unix Timestamp
mysql> CREATE TABLE IntToDateDemo (Number INT);
Query OK, 0 rows affected (0.59 sec)
mysql> INSERT INTO IntToDateDemo VALUES (1545284721), (1576820738), (1513748752), (1671515204);
2. ดูค่า INT ดิบ
mysql> SELECT * FROM IntToDateDemo;
+------------+
| Number |
+------------+
| 1545284721 |
| 1576820738 |
| 1513748752 |
| 1671515204 |
+------------+
4 rows in set (0.00 sec)
3. แปลงเป็น DATETIME (รูปแบบเต็ม)
mysql> SELECT FROM_UNIXTIME(Number) AS DateTimeDemo FROM IntToDateDemo;
+---------------------+
| DateTimeDemo |
+---------------------+
| 2018-12-20 12:25:21 |
| 2019-12-20 12:25:38 |
| 2017-12-20 12:25:52 |
| 2022-12-20 12:26:44 |
+---------------------+
4 rows in set (0.00 sec)
4. แปลงเป็น DATE เท่านั้น (Format Mask)
mysql> SELECT FROM_UNIXTIME(Number, '%Y-%m-%d') AS DateDemo FROM IntToDateDemo;
+------------+
| DateDemo |
+------------+
| 2018-12-20 |
| 2019-12-20 |
| 2017-12-20 |
| 2022-12-20 |
+------------+
4 rows in set (0.00 sec)
Format Specifiers สำหรับ FROM_UNIXTIME
เหมือน DATE_FORMAT() ทุกประการ:
| Format | ตัวอย่าง |
|---|---|
%Y-%m-%d %H:%i:%s | 2018-12-20 12:25:21 |
%Y-%m-%d | 2018-12-20 |
%d/%m/%Y %H:%i | 20/12/2018 12:25 |
%W, %M %d, %Y | Thursday, December 20, 2018 |
ฟังก์ชันคู่: UNIX_TIMESTAMP()
แปลง DATETIME → Unix Timestamp (INT)
SELECT UNIX_TIMESTAMP('2018-12-20 12:25:21'); -- 1545284721
SELECT UNIX_TIMESTAMP(); -- Current Timestamp
Timezone Consideration
FROM_UNIXTIME()คืนค่าใน **Session Timezone** (@@session.time_zone)- Unix Timestamp ตนเองเป็น UTC เสมอ
- หากต้องการ UTC บังคับ:
CONVERT_TZ(FROM_UNIXTIME(ts), @@session.time_zone, '+00:00')
ข้อจำกัดช่วงปี (Year Range)
| ชนิด | ช่วง Unix Timestamp | ช่วงปี |
|---|---|---|
INT (32-bit signed) | 0 ถึง 2,147,483,647 | 1970 ถึง 2038 (Year 2038 Problem) |
BIGINT (64-bit signed) | 0 ถึง 9,223,372,036,854,775,807 | 1970 ถึง ~292 Billion Years |
แนะนำ: ใช้ BIGINT สำหรับ Unix Timestamp ใน Schema ใหม่ เพื่อป้องกัน Year 2038 Problem
ตัวอย่าง: แปลงคอลัมน์ INT → DATETIME แบบถาวร
ALTER TABLE IntToDateDemo
ADD COLUMN DateTimeCol DATETIME;
UPDATE IntToDateDemo
SET DateTimeCol = FROM_UNIXTIME(Number);
-- ตรวจสอบแล้ว Drop Column เก่า
ALTER TABLE IntToDateDemo DROP COLUMN Number;