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

การแปลง Timestamp เป็นเดือนใน MySQL ด้วย FROM_UNIXTIME

เมื่อเก็บวันที่เป็น Unix Timestamp (จำนวนวินาทีจาก 1970-01-01 UTC) ในคอลัมน์ BIGINT/INT สามารถแปลงเป็นวันที่/เวลา แล้วดึงส่วนเดือนได้ด้วยฟังก์ชัน FROM_UNIXTIME() และ MONTH()

ตัวอย่างการใช้งาน

สร้างตารางเก็บ Timestamp:

mysql> CREATE TABLE DemoTable1457 (Value BIGINT);

เพิ่มข้อมูล Timestamp:

mysql> INSERT INTO DemoTable1457 VALUES (1570207117), (1548947534), (1575213134);

ดูข้อมูล:

mysql> SELECT * FROM DemoTable1457;
+------------+
| Value      |
+------------+
| 1570207117 |
| 1548947534 |
| 1575213134 |
+------------+

แปลง Timestamp เป็นเดือน:

mysql> SELECT MONTH(FROM_UNIXTIME(Value)) FROM DemoTable1457;

ผลลัพธ์ (เดือน 10, 1, 12):

+-----------------------------+
| MONTH(FROM_UNIXTIME(Value)) |
+-----------------------------+
|                          10 |
|                           1 |
|                          12 |
+-----------------------------+

ฟังก์ชันที่เกี่ยวข้อง

ฟังก์ชันคำอธิบายตัวอย่าง
FROM_UNIXTIME(unix_ts)แปลง Unix Timestamp → DATETIMEFROM_UNIXTIME(1570207117) → '2019-10-04 12:38:37'
UNIX_TIMESTAMP(date)แปลง DATETIME → Unix TimestampUNIX_TIMESTAMP('2019-10-04 12:38:37') → 1570207117
MONTH(date)ดึงเดือน (1-12)MONTH('2019-10-04') → 10
YEAR(date)ดึงปีYEAR('2019-10-04') → 2019
DATE_FORMAT(date, fmt)จัดรูปแบบวันที่DATE_FORMAT(FROM_UNIXTIME(ts), '%Y-%m')

Timezone Considerations

  • FROM_UNIXTIME() ใช้ Timezone ของ Session (@@session.time_zone)
  • Unix Timestamp เป็น UTC เสมอ → ผลลัพธ์จะเปลี่ยนตาม Timezone
  • ตั้ง Timezone: SET time_zone = '+07:00'; (สำหรับไทย)
  • หรือใช้ CONVERT_TZ(FROM_UNIXTIME(ts), 'UTC', '+07:00')

การประยุกต์ใช้

  • รายงานสรุปยอดขาย/กิจกรรมต่อเดือนจาก Log Timestamp
  • Group By เดือน: SELECT MONTH(FROM_UNIXTIME(ts)), COUNT(*) FROM logs GROUP BY 1
  • Partition Table ตามเดือนจาก Timestamp
  • ETL: แปลง Timestamp จาก External System เป็น DateTime ใน MySQL

Best Practice

  • เก็บเป็น DATETIME/TIMESTAMP แทน BIGINT หากเป็นไปได้ (Readable, Indexable, Timezone-aware)
  • TIMESTAMP ใน MySQL แปลง UTC ↔ Session Timezone อัตโนมัติ (Range: 1970-2038)
  • DATETIME เก็บค่าคงที่ ไม่แปลง Timezone (Range: 1000-9999)
  • BigInt Timestamp ใช้เมื่อต้อง相容กับ External Systems ที่ส่ง Unix Time มา