Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

แปลง INT (Unix Timestamp) เป็น DATETIME ใน MySQL ด้วย FROM_UNIXTIME()

เมื่อมีค่า 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:%s2018-12-20 12:25:21
%Y-%m-%d2018-12-20
%d/%m/%Y %H:%i20/12/2018 12:25
%W, %M %d, %YThursday, 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,6471970 ถึง 2038 (Year 2038 Problem)
BIGINT (64-bit signed)0 ถึง 9,223,372,036,854,775,8071970 ถึง ~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;