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

แปลง MySQL DATETIME เป็น Unix Timestamp

ใช้ฟังก์ชัน UNIX_TIMESTAMP() และ STR_TO_DATE() ร่วมกันเพื่อแปลง DateTime String เป็น Unix Timestamp

Basic Conversion

-- String -> DATETIME -> Unix Timestamp
SELECT UNIX_TIMESTAMP(STR_TO_DATE('Oct 19 2018 10:00PM', '%M %d %Y %h:%i%p'));
-- ผลลัพธ์: 1539966600

Format Specifiers ใน STR_TO_DATE

Specifierความหมายตัวอย่าง
%MMonth Name (January-December)October
%mMonth Number (01-12)10
%dDay (01-31)19
%YYear (4 digits)2018
%yYear (2 digits)18
%HHour 24h (00-23)22
%hHour 12h (01-12)10
%iMinutes (00-59)00
%sSeconds (00-59)00
%pAM/PMPM

กลับคืน: Unix Timestamp -> DATETIME

SELECT FROM_UNIXTIME(1539966600);
-- ผลลัพธ์: 2018-10-19 22:00:00

-- กำหนด Format
SELECT FROM_UNIXTIME(1539966600, '%m-%d-%Y %h:%i:%p');
-- ผลลัพธ์: 10-19-2018 10:00:PM

ใช้กับ Column โดยตรง

-- ถ้าคอลัมน์เป็น DATETIME/TIMESTAMP แล้ว
SELECT UNIX_TIMESTAMP(created_at) FROM orders;

-- ถ้าคอลัมน์เป็น VARCHAR (String)
SELECT UNIX_TIMESTAMP(STR_TO_DATE(date_str, '%Y-%m-%d %H:%i:%s')) FROM logs;

MySQL 8.0+: CAST to DATETIME

-- สะดวกกว่า STR_TO_DATE สำหรับ Format มาตรฐาน
SELECT UNIX_TIMESTAMP(CAST('2018-10-19 22:00:00' AS DATETIME));

Timezone Considerations

  • UNIX_TIMESTAMP() แปลงจาก Session Timezone ไป UTC
  • FROM_UNIXTIME() แปลงจาก UTC ไป Session Timezone
  • เก็บข้อมูลเป็น UTC ใน DB แปลง Timezone ตอนแสดงผล

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

-- Log Table: เก็บ Unix Timestamp (BIGINT) แทน DATETIME
CREATE TABLE api_logs (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    endpoint VARCHAR(255),
    request_time BIGINT,  -- UNIX_TIMESTAMP()
    response_time BIGINT,
    duration_ms INT
);

-- Insert
INSERT INTO api_logs (endpoint, request_time, response_time, duration_ms)
VALUES ('/api/users', UNIX_TIMESTAMP(NOW()), UNIX_TIMESTAMP(NOW()) + 1, 150);

-- Query: ความล่าช้าเฉลี่ย 1 ชม. ล่าสุด
SELECT AVG(duration_ms) FROM api_logs
WHERE request_time > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 HOUR));