FiveM MariaDB Incorrect Date/Datetime Value แก้อย่างไร? วิธีแก้ Error 1292 เมื่อวันเวลาไม่ตรง Format หรือ SQL Mode

 FiveM MariaDB Error 1292 มักพบเมื่อ Resource พยายามบันทึกวันหรือเวลาที่ MariaDB ไม่สามารถตีความได้อย่างถูกต้อง เช่น วันที่ไม่มีจริง, รูปแบบ DD/MM/YYYY ถูกส่งลง DATE, String ว่างถูกส่งลง DATETIME, Timestamp ถูกใช้ผิดหน่วย หรือ Database Schema กับ Script คนละเวอร์ชัน

MariaDB กำหนด Error 1292, SQLSTATE 22007 และชื่อ ER_TRUNCATED_WRONG_VALUE โดยข้อความหลักคือ Truncated incorrect ... value.

ตัวอย่างที่อาจพบใน FiveM Console:

Incorrect datetime value: '2026-13-45'
for column 'last_seen' at row 1

หรือ:

Truncated incorrect datetime value

แนวทางแก้ที่ถูกต้องคือ:

Error 1292
↓
ดู Column
↓
ดูค่าที่ Resource ส่งจริง
↓
ดูว่าเป็น DATE / DATETIME / TIMESTAMP / YEAR
↓
ตรวจ Format
↓
ตรวจ Timestamp หน่วยวินาทีหรือมิลลิวินาที
↓
ตรวจ SQL_MODE
↓
ตรวจ Resource กับ Schema Version
↓
แก้ต้นเหตุ

① Error 1292 คืออะไร

MariaDB ระบุ:

Error Code: 1292
SQLSTATE: 22007
ER_TRUNCATED_WRONG_VALUE

โดย Database ได้รับค่าที่ไม่สามารถตีความเป็น Temporal/Numeric Value ตามรูปแบบที่ Statement หรือ Column ต้องการได้อย่างถูกต้อง.

กรณี FiveM ที่พบบ่อยคือ:

DATE
DATETIME
TIMESTAMP
YEAR

ได้รับค่าที่ Format ไม่ถูกต้อง

② ตัวอย่างง่ายที่สุด

สมมติ Table:

CREATE TABLE `players` (
    `last_seen` DATETIME NOT NULL
);

แต่ Resource ส่ง:

13/08/2026 19:30

ขณะที่รูปแบบมาตรฐานที่ใช้กับ MariaDB DATETIME โดยทั่วไปคือ:

YYYY-MM-DD HH:MM:SS

เช่น:

2026-08-13 19:30:00

MariaDB ระบุว่า DATETIME ใช้สำหรับเก็บค่ารวมวันที่และเวลา และมีรูปแบบมาตรฐานตาม Temporal Data Type ของระบบ.

③ DATE ต่างจาก DATETIME อย่างไร

DATE

เก็บเฉพาะ:

YYYY-MM-DD

เช่น:

2026-08-13

MariaDB ระบุช่วงปกติของ DATE ตั้งแต่ปี 1000 ถึง 9999.

DATETIME

เก็บทั้ง:

YYYY-MM-DD HH:MM:SS

เช่น:

2026-08-13 19:30:00

ใช้เมื่อ FiveM Resource ต้องจำทั้งวันและเวลา.

④ TIMESTAMP ต่างจาก DATETIME อย่างไร

TIMESTAMP และ DATETIME ใช้เก็บวันเวลาได้ แต่มี Semantics และ Range ต่างกัน

MariaDB ระบุว่า TIMESTAMP ถูกเก็บบนพื้นฐานของ Epoch Seconds และมีข้อจำกัด Range ของตัวเอง ขณะที่ DATETIME เหมาะกว่าเมื่อจำเป็นต้องเก็บวันเวลาที่อยู่นอก Range ของ TIMESTAMP.

ดังนั้นอย่าเลือก:

TIMESTAMP

หรือ:

DATETIME

เพียงเพราะทั้งคู่ดูเหมือนวันเวลา

ให้ดู Requirement ของ Resource

⑤ FiveM มักใช้วันเวลาตรงไหน

ตัวอย่าง:

last_seen
created_at
updated_at
last_login
banned_until
expires_at
owned_since
last_save

ถ้า Script หนึ่งมอง Field เป็น:

Unix Timestamp

แต่อีก Script มองเป็น:

DATETIME String

ก็สามารถเกิด Data Conversion Error ได้

⑥ รูปแบบวันที่ผิดเป็นสาเหตุหลัก

ตัวอย่างที่ควรหลีกเลี่ยงเมื่อ Column ต้องการ SQL Date:

13/08/2026
08/13/2026
13-08-2026
August 13, 2026

รูปแบบที่ชัดกว่า:

2026-08-13

สำหรับ DATE

และ:

2026-08-13 19:30:00

สำหรับ DATETIME

การใช้ Format เดียวกันทั้ง Resource ช่วยลด Conversion Bugs

⑦ วันที่ไม่มีจริงก็ Error ได้

ตัวอย่าง:

2026-02-31

หรือ:

2026-13-01

ไม่ใช่วันที่ปกติที่ถูกต้อง

MariaDB มี SQL_MODE เช่น ALLOW_INVALID_DATES ซึ่งสามารถเปลี่ยนวิธีที่ Database จัดการวันที่บางประเภทได้ โดยเอกสารเตือนว่าการเก็บ Invalid Dates แล้วเปลี่ยน Mode ภายหลังอาจทำให้ผลลัพธ์ไม่แน่นอน.

ดังนั้นอย่าเปิด ALLOW_INVALID_DATES เพียงเพื่อให้ Resource ที่ส่งวันที่ผิดทำงานต่อ

⑧ ALLOW_INVALID_DATES คืออะไร

MariaDB ระบุว่า Mode:

ALLOW_INVALID_DATES

สามารถอนุญาตบางวันที่ซึ่งปกติถือว่าไม่ถูกต้อง ตราบใดที่ Day อยู่ในช่วงที่ Mode ยอมรับ.

ตัวอย่างเชิงแนวคิด:

2026-02-31

อาจได้รับการจัดการต่างจาก Configuration ปกติ

แต่สำหรับ FiveM Production ไม่ควรใช้ Mode นี้เพื่อซ่อน Resource Bug

⑨ Zero Date คืออะไร

MariaDB สามารถมี Special Date Value เช่น:

0000-00-00

หรือ:

0000-00-00 00:00:00

ขึ้นกับ SQL_MODE ที่ใช้อยู่ และ NO_ZERO_DATE สามารถเปลี่ยนการยอมรับค่าเหล่านี้ได้.

ดังนั้น Server ที่ย้าย Hosting แล้วเริ่ม Error อาจต้องตรวจว่า SQL Mode เครื่องใหม่เข้มกว่าเครื่องเดิมหรือไม่

⑩ อย่าใช้ 0000-00-00 แทน NULL แบบสุ่ม

หาก Field หมายถึง:

ยังไม่มีวันหมดอายุ

ควรถามว่า Data Model ควรใช้:

NULL

หรือไม่

MariaDB ระบุว่า NULL หมายถึง Unknown/Missing Value และไม่เหมือน Empty String หรือเลขศูนย์.

ดังนั้น:

NULL

กับ:

0000-00-00

ไม่ควรถูกมองว่าเป็นสิ่งเดียวกัน

⑪ Empty String ลง DATETIME ต้องระวัง

Code ลักษณะนี้:

local expiresAt = data.expiresAt or ''

ถ้า Column:

`expires_at` DATETIME

Resource อาจส่ง:

''

เข้าสู่ Temporal Column

วิธีที่เหมาะกว่าคือกำหนด Business Rule ให้ชัดว่า:

ไม่มีวันหมดอายุ
→ NULL

หรือ:

ต้องมีวันที่
→ Reject Operation

ไม่ใช่เปลี่ยน Missing Value ทุกชนิดเป็น Empty String

⑫ nil กับ NULL ต้องออกแบบให้ถูก

ถ้า Column อนุญาต:

NULL

และข้อมูลไม่มีจริง การเก็บ NULL มักสื่อความหมายชัดกว่าการสร้างวันที่ปลอม

MariaDB ระบุชัดว่า NULL ไม่เท่ากับ Empty String หรือ Zero Value.

⑬ Parameter Order สลับทำ Date Error ได้

ตัวอย่าง:

MySQL.update.await([[
    UPDATE `players`
    SET `last_seen` = ?,
        `level` = ?
    WHERE `id` = ?
]], {
    level,
    lastSeen,
    playerId
})

แต่ SQL ต้องการ:

Parameter 1 = DATETIME
Parameter 2 = INT

Resource กลับส่ง:

Parameter 1 = 50
Parameter 2 = "2026-08-13 19:30:00"

Database อาจพยายามตีความ:

last_seen = 50

แล้วเกิด Temporal Conversion Error

จึงต้องตรวจ Parameter Order ก่อนแก้ Schema

⑭ oxmysql Placeholder ต้องตรงกับ Value

oxmysql รองรับ Parameter Placeholders เพื่อแยก Values ออกจาก SQL และ Documentation ปัจจุบันระบุการใช้ Parameters กับ Queries โดยตรง.

ตัวอย่าง:

MySQL.update.await(
    'UPDATE `players` SET `last_seen` = ? WHERE `id` = ?',
    {
        lastSeen,
        playerId
    }
)

ต้องตรวจทั้ง:

SQL
Parameter Order
Parameter Value
Parameter Type

ไม่ใช่ดู SQL อย่างเดียว

⑮ ใช้ NOW() ได้เมื่อไร

หาก Requirement คือ:

เก็บเวลาที่ Database Execute Query

สามารถใช้ MariaDB:

NOW()

หรือ:

CURRENT_TIMESTAMP()

แทนการประกอบ String วันเวลาเองใน Lua

MariaDB ระบุว่า NOW() และ CURRENT_TIMESTAMP() คืนค่าจุดเวลาปัจจุบันสำหรับการใช้งานกับ Temporal Operations.

ตัวอย่าง:

UPDATE `players`
SET `last_seen` = NOW()
WHERE `id` = ?;

⑯ NOW() ลด Format Bug ได้

แทน Resource ทำ:

local time =
    day .. '/' ..
    month .. '/' ..
    year

แล้วส่ง Database

สามารถให้ Databaseสร้าง Current Datetime เอง:

UPDATE `players`
SET `last_seen` = NOW()
WHERE `id` = ?;

หาก Requirementคือ Database Current Time จริง

ช่วยตัดปัญหา Format ที่ Resourceสร้างผิดออกไปส่วนหนึ่ง

⑰ แต่ NOW() ไม่เหมาะกับทุกกรณี

ถ้า FiveM ต้องเก็บ:

เวลาที่ Event เกิดจริงจากระบบอื่น

หรือ:

วันหมดอายุที่คำนวณไว้ล่วงหน้า

ก็ยังต้องส่งค่าที่ถูกต้องเข้า Database

อย่าใช้ NOW() แทนทุก Temporal Field เพียงเพื่อให้ Error หาย

⑱ Unix Timestamp คืออะไร

บาง Resource ไม่ส่ง:

2026-08-13 19:30:00

แต่ส่ง Integer Epoch เช่น:

1786624200

ถ้า Column เป็น:

BIGINT

อาจตั้งใจเก็บ Epoch

แต่ถ้า Column เป็น:

DATETIME

ต้องมี Conversion Strategy ที่ชัดเจน

อย่าส่ง Numeric Epoch ลง DATETIME โดยหวังว่า Database จะเดาความหมายเอง

⑲ Unix Seconds กับ Milliseconds ต่างกันมหาศาล

ตัวอย่างเชิงแนวคิด:

Unix seconds
≈ 1,786,xxx,xxx

แต่ milliseconds:

≈ 1,786,xxx,xxx,xxx

ต่างกันประมาณ:

1,000 เท่า

ดังนั้น Resource ที่เปลี่ยน Library แล้วเริ่มส่ง Milliseconds แทน Seconds สามารถสร้าง Date/Range Problems ได้

⑳ FROM_UNIXTIME ใช้ทำอะไร

MariaDB มี:

FROM_UNIXTIME(...)

สำหรับแปลง Unix Timestamp เป็น Temporal Value

แต่ MariaDB ระบุว่า Timestamp Range มีข้อจำกัด และค่า Unix Timestamp ที่อยู่นอกช่วงรองรับสามารถคืน NULL.

ดังนั้นต้องตรวจ:

Seconds หรือ milliseconds?

ก่อนใช้

ตัวอย่าง:

SELECT FROM_UNIXTIME(1786624200);

㉑ อย่าใส่ Milliseconds เข้า FROM_UNIXTIME โดยตรง

ถ้า Value เป็น:

1786624200000

แต่ Function คาด Unix Seconds ตาม Use Case ปกติ ค่าอาจเกิน Range อย่างรุนแรง

ต้อง Normalize:

milliseconds
÷ 1000
=
seconds

เมื่อ Data Contract ของระบบยืนยันว่า Input คือ Milliseconds จริง

㉒ STR_TO_DATE ใช้เมื่อไร

MariaDB มี:

STR_TO_DATE(string, format)

สำหรับ Parse String ตาม Format ที่กำหนด

เช่นใน Migration/Import ที่ต้องรับ String Formatเฉพาะ

MariaDB ระบุว่า Invalid Date String สามารถทำให้ STR_TO_DATE() คืน NULL พร้อม Warning และภายใต้ SQL Mode บางแบบอาจเกิด Error.

㉓ ตัวอย่าง STR_TO_DATE

ถ้าข้อมูลเดิมเป็น:

13/08/2026

อาจ Parseตาม Format:

SELECT STR_TO_DATE(
    '13/08/2026',
    '%d/%m/%Y'
);

แต่สำหรับ Runtime Resource หากสามารถส่ง:

2026-08-13

ตรงตั้งแต่ต้น จะง่ายและปลอดภัยกว่าการ Parse Stringทุก Query

㉔ อย่าใช้ STR_TO_DATE ซ่อน Format ที่ไม่แน่นอน

ถ้า Client บางคนส่ง:

13/08/2026

บางคนส่ง:

08/13/2026

คุณไม่ควรเดาว่า:

ตัวแรกคือวันหรือตัวแรกคือเดือน?

กำหนด API Contract เดียว:

YYYY-MM-DD

จะลด Ambiguity มากกว่า

㉕ YEAR ต้องส่งให้ถูก Type

MariaDB YEAR แสดงผลแบบสี่หลัก และรองรับช่วงหลักตั้งแต่ 1901–2155 รวม Special Zero Value ตามกฎของ Type.

ถ้า Column:

`model_year` YEAR

ควรส่ง:

2026

ไม่ใช่:

2026-08-13

㉖ สองหลักสำหรับ YEAR ไม่ควรใช้

MariaDB Documentation ระบุว่ารูปแบบปีสองหลักยังรองรับแต่มีความคลุมเครือและถูกมองว่า Error-prone.

ดังนั้น FiveM Resourceควรใช้:

2026

แทน:

26

เพื่อลด Ambiguity

㉗ DATE Range ก็ต้องตรวจ

MariaDB DATE รองรับช่วงวันตาม Data Type ของมัน ไม่ใช่ทุกค่า String ที่ดูเหมือนวันจะใช้ได้.

ถ้า Script ส่ง:

99999-01-01

การเพิ่ม VARCHAR ไม่ใช่คำตอบถ้า Field นี้ควรเป็น Date จริง

㉘ TIMESTAMP Range ต้องระวัง

MariaDB Documentation ปัจจุบันระบุว่า TIMESTAMP อิง Epoch Seconds และมี Maximum ที่สัมพันธ์กับปี 2106 ในระบบที่รองรับ Range ดังกล่าว.

ถ้า FiveM Resource ต้องเก็บวันที่ไกลมาก เช่น:

9999-12-31

เป็น Sentinel “ไม่หมดอายุ”

TIMESTAMP อาจไม่ใช่ Type ที่เหมาะ

ควรออกแบบ:

DATETIME

หรือ:

NULL

ตาม Business Rule

㉙ อย่าใช้ปี 9999 แบบสุ่ม

ระบบ Ban หรือ Subscription บาง Script ใช้:

9999-12-31

หมายถึง:

ถาวร

แต่หาก Column เป็น TIMESTAMP จะต้องตรวจ Range ก่อน

ทางออกที่สะอาดกว่าอาจเป็น:

expires_at = NULL
permanent = 1

ตาม Data Model ที่ออกแบบไว้

ไม่ควรพึ่ง Magic Date โดยไม่จำเป็น

㉚ Time Zone ทำให้ 1292 ไหม

Time Zone Problems ไม่ใช่สาเหตุเดียวของ 1292 และไม่ควรสรุปทันทีว่า Error Date Format เกิดจาก Time Zone

แต่ TIMESTAMP มี Time-zone-related semantics ต่างจาก DATETIME และ MariaDB มีระบบ Time Zone ของ Database แยกต่างหาก.

ดังนั้นต้องแยก:

Format Error

ออกจาก:

Timezone Interpretation

ให้ชัด

㉛ DATETIME เหมาะกับ Local Wall-clock Time มากกว่าในบางกรณี

MariaDB แยก Semantics ของ DATETIME และ TIMESTAMP รวมถึง Temporal Functions ที่เกี่ยวกับ Current Time.

จึงควรเลือก Type ตามความหมาย เช่น:

เกิดเหตุการณ์ ณ จุดเวลาเดียวทั่วโลก

กับ:

เวลาปฏิทินที่ต้องการเก็บตรงตัว

ไม่ใช่ใช้ Type เดียวทุกระบบ

㉜ Error 1292 หลัง Update Script

ถ้าก่อน Update ใช้งานได้ แต่หลัง Updateเริ่ม Error ให้ตรวจ:

Resource Version
Migration
Date Format ใหม่
Timestamp Unit
Column Type

ตัวอย่าง:

v1
→ Unix seconds

v2
→ ISO datetime string

แต่ Database ยังใช้ Schema/Parsing Logic ของ v1

㉝ Error 1292 หลังเปลี่ยน Framework

Framework เดิมอาจใช้:

created_at = BIGINT

Framework ใหม่ใช้:

created_at = DATETIME

Custom Script ที่ยังส่ง Epoch Integer ตาม Data Model เดิมอาจไม่เข้ากับ Schemaใหม่

ต้อง Migrationทั้ง:

Schema
Data
Code

ไม่ใช่เพียงเปลี่ยน Resource Folder

㉞ Error 1292 หลัง Restore Backup

สมมติ Backup เก่าใช้:

0000-00-00

จำนวนมาก

แต่ Server ใหม่ใช้ SQL Mode ที่ไม่ยอมรับ Zero Date

หลัง Restore/Update อาจเริ่มเห็น Date Errors ได้

MariaDB ระบุว่า NO_ZERO_DATE, NO_ZERO_IN_DATE และ ALLOW_INVALID_DATES มีผลต่อ Temporal Values.

㉟ Error หลังย้าย VPS

ตรวจอย่างน้อย:

SELECT VERSION();
SELECT @@sql_mode;

และ:

SHOW CREATE TABLE `table_name`;

จากนั้นเปรียบเทียบกับเครื่องเดิม

อย่าดูเพียง Connection String เพราะ Error 1292 แปลว่า Queryไปไกลถึงขั้น Databaseกำลังตีความ Value แล้ว

㊱ ตรวจ SQL_MODE

MariaDB มี SQL Modes ที่เกี่ยวข้องกับ Invalid/Zero Dates เช่น:

ALLOW_INVALID_DATES
NO_ZERO_DATE
NO_ZERO_IN_DATE

และ Mode เหล่านี้เปลี่ยนวิธีที่ MariaDBยอมรับ Temporal Values.

ดังนั้น:

SELECT @@sql_mode;

เป็น Query ที่ควรตรวจเมื่อ Server ใหม่มี Behavior ต่างจาก Server เดิม

㊲ ไม่ควรปิด Strictness เพื่อแก้ Script

ถ้า Resource ส่ง:

2026-99-99

สิ่งที่ควรแก้คือ:

Resource Date

ไม่ใช่พยายามปรับ Databaseให้รับวันที่ที่ผิด

Error Database ที่ชัดเจนช่วยป้องกัน Invalid Persistent State

㊳ mysql_debug ช่วยหา Query ได้

oxmysql มี Debug Tools โดย Query Speeds และข้อมูล Debug สามารถดูได้ผ่าน Server Console/Debug UI เมื่อเปิด mysql_debug.

เมื่อ Error 1292 เกิด ให้หา:

Resource
Query
Column
Parameter
Timestamp ของ Error

ให้ครบ

㊴ Log Date Value ก่อน Query

ตัวอย่าง:

print(
    'lastSeen:',
    lastSeen,
    'type:',
    type(lastSeen)
)

ถ้าเห็น:

lastSeen = 13/08/2026

แต่ Database ต้องการ DATETIME ก็ได้เบาะแสทันที

㊵ อย่า Debug จาก Error Message อย่างเดียว

เก็บอย่างน้อย:

① Error Code
② Table
③ Column
④ SQL
⑤ Parameter
⑥ Lua Type

เพราะ:

Incorrect datetime value

บอก Column ได้

แต่ไม่ได้บอกเสมอว่า Resourceสร้างค่านั้นมาจาก Functionไหน

㊶ ใช้ Current Database Time เมื่อเหมาะสม

สำหรับ Field เช่น:

created_at
updated_at
last_seen

หาก Requirementคือเวลาที่ Queryเกิด สามารถใช้:

NOW()

เช่น:

UPDATE `players`
SET `last_seen` = NOW()
WHERE `id` = ?;

MariaDB รองรับ NOW()/CURRENT_TIMESTAMP() สำหรับ Current Temporal Values.

㊷ created_at ใช้ DEFAULT ได้ในบาง Design

แทนให้ Resource ส่ง Current Time เองทุกครั้ง Database Schema สามารถออกแบบให้ Default Timestamp/Datetime ตาม Requirement ได้

แต่ต้องใช้ตาม Official Schema ของ Resource ไม่ควร ALTER Production เพียงเพราะต้องการลด Code

㊸ updated_at ต้องวาง Strategy ให้ชัด

อาจเลือก:

Resource Update เวลาเอง

หรือ:

Database Update เวลา

ตาม Data Model

สิ่งสำคัญคืออย่าให้:

Resource A
ใช้ UTC String

แต่:

Resource B
ใช้ Local Date String แบบ DD/MM/YYYY

เขียน Column เดียวกัน

㊹ Date Parsing ควรอยู่จุดเดียว

ถ้าต้องรับ Dateจาก UI ให้ Normalize ที่ Server:

Client Format
↓
Server Validate
↓
Canonical Format
↓
Database

เช่นทุกค่ากลายเป็น:

YYYY-MM-DD

ก่อน SQL

ช่วยลด Resource แต่ละตัว Parse วันเวลาต่างกัน

㊺ Client ไม่ควรส่ง SQL Date โดยไม่มี Validation

Client สามารถส่ง:

hello
9999
31/31/2026

ได้

Server ต้องตรวจ:

Format
Range
Permission
Business Rule

ก่อน Database

Database Error เป็น Safety Layer ไม่ใช่ Frontend Validation

㊻ วันหมดอายุควรตรวจว่ามากกว่าวันเริ่มต้น

ถึง Date Format ถูก:

2026-08-01

ก็ไม่ได้แปลว่า Business Logic ถูก

ตัวอย่าง:

start_at
2026-08-13

expires_at
2026-08-01

Database อาจรับได้

แต่ Logic “หมดอายุก่อนเริ่ม” อาจไม่ถูก

จึงต้องมี Application Validation เพิ่ม

㊼ Error 1292 กับ Error 1366 ต่างกัน

บทความก่อน:

1366
Incorrect value for column

มักเจอกับ Type Mismatch เช่น String ลง Integer

ส่วน:

1292
Truncated incorrect value

พบได้กับ Temporal Parsing และ Conversion Context อื่นๆ. MariaDB แยก Error Codes สองตัวออกจากกัน.

㊽ Error 1292 กับ Error 1265

1265
Data truncated for column

และ:

1292
Truncated incorrect value

ข้อความคล้ายกัน แต่เป็นคนละ Error Code

จึงต้องอ่าน:

1265 หรือ 1292?

ก่อนแก้

㊾ Error 1292 กับ Error 1264

1264 คือ:

Out of range value

ส่วน 1292 เน้น:

Value ไม่สามารถตีความได้ถูกต้อง

ตัวอย่างเช่น Temporal String ผิด

อย่าเปลี่ยน INT เป็น BIGINT หาก Error จริงคือ Incorrect Datetime Value

㊿ Error 1292 กับ Error 1064

1064
SQL Syntax Error

หมายถึง Parser อ่าน SQL Structure ไม่ผ่าน

แต่:

1292

มักหมายถึง SQL Structure ผ่านแล้ว แต่ Value ที่ถูกนำมาประมวลผลไม่ถูกต้อง

ดังนั้น:

comma
parenthesis

ไม่ใช่จุดแรกที่ควรตรวจเมื่อ Error ระบุ Datetime Value ชัดเจน

51. Transaction ช่วยไหม

ถ้า Operation มีหลาย Queries และ Query หนึ่งเกิด Error Date/Datetime ควรให้ Transaction Rollbackทั้ง Business Operation เมื่อทุก Queryจำเป็นต้องสำเร็จพร้อมกัน

แต่ Transaction ไม่สามารถแก้:

2026-13-99

ให้เป็นวันที่ถูกต้องเอง

Validation ยังต้องทำก่อน SQL

52. SQL Migration ต้องตรวจ Existing Dates

ก่อนเปลี่ยน:

VARCHAR
→ DATE

หรือ:

BIGINT
→ DATETIME

ต้องตรวจ Existing Values ก่อน

เพราะข้อมูลเก่าอาจมี:

''
N/A
never
0000-00-00

ซึ่งไม่สามารถ Convertเป็น Dateแบบใหม่ได้ตรงๆ

53. อย่า ALTER VARCHAR เป็น DATE ทันที

สมมติ Column เดิมเก็บ:

2026-08-13
13/08/2026
never
NULL

ปนกัน

ก่อนเปลี่ยนเป็น DATE ต้อง:

Profile Existing Values
Normalize
Backup
Migration
Verify

ไม่อย่างนั้น Migrationเองอาจ Error

54. วิธีหา Format ที่มีอยู่

ตัวอย่าง:

SELECT
    `expires_at`,
    COUNT(*) AS `total`
FROM `players`
GROUP BY `expires_at`
ORDER BY `total` DESC
LIMIT 50;

ใช้บน Test/Backup เพื่อดู Data Shape ก่อน Migration

หาก Table ใหญ่ควรวาง Query ตาม Performance ที่เหมาะสม

55. Permanent Ban ควรเก็บยังไง

มีหลาย Data Model ที่ถูกต้อง เช่น:

expires_at = NULL
permanent = 1

หรือโครงสร้างอื่นที่ Framework กำหนด

สิ่งที่ควรหลีกเลี่ยงคือใช้:

9999-99-99

เป็น Magic Date ที่ไม่ถูกต้อง

56. Temporary Ban ควรใช้ Type ไหน

ขึ้นกับ Framework

ถ้าใช้ Absolute Datetime:

banned_until DATETIME

ถ้าใช้ Epoch:

banned_until BIGINT

ก็ได้ตาม Architecture

แต่ Code และ Databaseต้องใช้ Model เดียวกัน

อย่าให้ Resourceหนึ่งเขียน Epoch อีก Resourceตีความเป็น DATETIME

57. Date String ควรเป็น Canonical Format

แนะนำเชิง Architecture:

DATE
YYYY-MM-DD

DATETIME
YYYY-MM-DD HH:MM:SS

เพื่อให้ Code อ่านง่ายและไม่กำกวม

ส่วนการแสดงผู้ใช้เป็น:

13/08/2026

สามารถ Format ตอน UI Layer

อย่าใช้ Display Format เป็น Database Contract โดยไม่จำเป็น

58. UI Format กับ Database Format คนละเรื่อง

ผู้เล่นไทยอาจเห็น:

13/08/2026

แต่ Databaseสามารถเก็บ:

2026-08-13

Resourceทำ Conversion ตอน Display

วิธีนี้ช่วยไม่ให้:

DD/MM

กับ:

MM/DD

สับสนใน Database

59. วิธีแก้ Error 1292 แบบ 5 นาที

เมื่อ Console ขึ้น:

Incorrect datetime value

ทำตามนี้:

  1. ยืนยัน Error Code 1292
  2. จด Table
  3. จด Column
  4. จด Value ที่ Error แสดง
  5. SHOW CREATE TABLE
  6. ตรวจ DATE/DATETIME/TIMESTAMP/YEAR
  7. ตรวจ Date Format
  8. ตรวจว่า Date มีจริงหรือไม่
  9. ตรวจ Empty String
  10. ตรวจ Zero Date
  11. ตรวจ Parameter Order
  12. ตรวจ Unix Seconds/Milliseconds
  13. ตรวจ Resource Version
  14. ตรวจ Migration
  15. ตรวจ @@sql_mode
  16. แก้ต้นเหตุ
  17. ทดสอบ Flow เดิม

60. ตัวอย่าง Debug จริง

Error:

Incorrect datetime value:
'13/08/2026 19:30'
for column 'last_seen'

Schema:

`last_seen` DATETIME

Resource:

local lastSeen = os.date('%d/%m/%Y %H:%M')

ตรงนี้ Format ที่ Resourceสร้างไม่ใช่ Canonical DATETIME String ที่ Database Logic ตั้งใจใช้

แก้ให้ Resourceส่ง Format ที่ชัดเจน หรือใช้ NOW() ถ้า Requirementคือ Current Database Time.

61. ตัวอย่าง Timestamp Milliseconds

Resource ส่ง:

1786624200000

แต่ Code คิดว่าเป็น Unix Seconds

หากนำไปใช้กับ:

FROM_UNIXTIME(?)

โดยตรง Value อาจอยู่นอก Range ที่รองรับ

MariaDB ระบุว่า FROM_UNIXTIME() มีข้อจำกัดตาม TIMESTAMP Range.

ต้องตรวจ Unit ก่อน Conversion

62. ตัวอย่าง Zero Date

Resourceส่ง:

0000-00-00

Server เดิมรับ

Server ใหม่ Error

ตรวจ:

SELECT @@sql_mode;

เพราะ MariaDB ระบุว่า NO_ZERO_DATE และ Mode ที่เกี่ยวข้องมีผลกับ Zero Date Behavior.

อย่าปิด Modeก่อนตรวจว่า Resourceควรใช้ NULL แทนหรือไม่

63. ตัวอย่างวันที่ไม่มีจริง

Resourceส่ง:

2026-02-31

แทนที่จะเปิด:

ALLOW_INVALID_DATES

ให้แก้ Date Validation

MariaDB ระบุว่า ALLOW_INVALID_DATES สามารถอนุญาต Invalid Calendar Dates บางชนิด แต่ยังเตือนถึงผลของการเปลี่ยน Modeกับข้อมูลที่เก็บไว้.

64. Checklist Error 1292 สำหรับ FiveM

ตรวจทั้งหมดนี้:

  1. Error Code เป็น 1292 หรือไม่
  2. SQLSTATE เป็น 22007 หรือไม่
  3. Table ไหน
  4. Column ไหน
  5. Value อะไร
  6. Resource ไหน
  7. Query อะไร
  8. Parameter ไหน
  9. Column เป็น DATE หรือไม่
  10. DATETIME หรือไม่
  11. TIMESTAMP หรือไม่
  12. YEAR หรือไม่
  13. Value Format คืออะไร
  14. มีวัน/เดือนสลับหรือไม่
  15. Date มีจริงหรือไม่
  16. Empty String หรือไม่
  17. Zero Date หรือไม่
  18. NULL เหมาะกว่าหรือไม่
  19. Unix Timestamp หรือไม่
  20. Seconds หรือ Milliseconds
  21. Parameter Order ถูกหรือไม่
  22. Lua Type คืออะไร
  23. Resource Version ตรงไหม
  24. Schema Version ตรงไหม
  25. Migration ครบไหม
  26. SQL_MODE คืออะไร
  27. NO_ZERO_DATE มีไหม
  28. NO_ZERO_IN_DATE มีไหม
  29. ALLOW_INVALID_DATES มีไหม
  30. Server เพิ่งย้าย VPS หรือไม่
  31. Backup มาจาก Schema เก่าหรือไม่
  32. Existing Date Data สะอาดหรือไม่
  33. Client Input Validate แล้วหรือไม่
  34. Server Normalize Date หรือไม่
  35. Test Flow หลังแก้แล้วหรือไม่

FiveM Incorrect Datetime Value แก้อย่างไร

เริ่มจากดู Column:

SHOW CREATE TABLE `table_name`;

จากนั้นเปรียบเทียบ:

Value ที่ Resource ส่ง
กับ
Temporal Type ที่ Database ต้องการ

MariaDB Error 1292 ระบุว่า Value ที่ได้รับไม่สามารถตีความอย่างถูกต้องตาม Type/Operation นั้น.

FiveM Error 1292 คืออะไร

คือ MariaDB:

ER_TRUNCATED_WRONG_VALUE

SQLSTATE:

22007

และข้อความหลัก:

Truncated incorrect ... value

FiveM Incorrect Date Value หลัง Update Script แก้อย่างไร

ตรวจ:

Resource Version
Migration
DATE/DATETIME Column
Value Format
Timestamp Unit

หาก Resource Format เปลี่ยน แต่ Schema/Code อื่นยังใช้ Format เดิม ต้อง Migration Data Contract ให้ตรงกัน

FiveM Incorrect Datetime หลังย้าย VPS แก้อย่างไร

เปรียบเทียบ:

SELECT VERSION();
SELECT @@sql_mode;

และ:

SHOW CREATE TABLE `table_name`;

โดยเฉพาะ SQL Modes ที่เกี่ยวข้องกับ Invalid/Zero Dates.

FiveM 0000-00-00 Error แก้อย่างไร

ตรวจ SQL_MODE ก่อน

หาก Applicationใช้ Zero Dateแทน “ไม่มีวัน” ให้พิจารณาว่า Data Model ควรเปลี่ยนเป็น:

NULL

หรือ Representation อื่นที่ชัดเจนหรือไม่

MariaDB ระบุว่า NULL ไม่เหมือน Zero Value หรือ Empty String.

FiveM DATE ควรใช้ Format อะไร

รูปแบบ Canonical ที่ควรใช้กับ DATE คือ:

YYYY-MM-DD

เช่น:

2026-08-13

MariaDB DATE Documentation ระบุ Date Representation และ Range ของ Type นี้.

FiveM DATETIME ควรใช้ Format อะไร

รูปแบบทั่วไป:

YYYY-MM-DD HH:MM:SS

เช่น:

2026-08-13 19:30:00

MariaDB มี DATETIME สำหรับ Date+Time Values.

FiveM ใช้ Unix Timestamp หรือ DATETIME ดีกว่า

ไม่มีคำตอบเดียว

เลือกตาม Data Model

ถ้าใช้ Unix Timestamp:

ทุก Resource ต้องรู้ว่าเป็น Seconds หรือ Milliseconds

ถ้าใช้ DATETIME:

ทุก Resource ต้องส่ง/อ่าน Temporal Format ให้ตรง

ความสม่ำเสมอสำคัญกว่าการเลือกตามกระแส

FiveM ใช้ NOW() ดีไหม

ถ้าต้องการ Current Database Time เช่น:

created_at
updated_at
last_seen

สามารถใช้ NOW()/CURRENT_TIMESTAMP() ตาม Requirementได้.

แต่ไม่ควรใช้แทนวันที่ที่ผู้ใช้หรือระบบภายนอกกำหนดไว้จริง

FiveM STR_TO_DATE ใช้ได้ไหม

ได้ MariaDB STR_TO_DATE() ใช้ Parse String ตาม Format ที่ระบุ แต่ Invalid Values สามารถคืน NULL/Warning หรือ Error ตาม SQL Mode.

สำหรับ Runtime Code ควร Normalize Format ตั้งแต่ Application Layer หากทำได้

FiveM Timestamp Milliseconds แก้อย่างไร

ยืนยันก่อนว่าค่าที่ได้รับคือ:

milliseconds

จริง

หากระบบปลายทางต้องใช้ Epoch Seconds จึงค่อย Convert:

milliseconds / 1000

อย่าหาร 1000 แบบสุ่มเพียงเพราะตัวเลขดูใหญ่

FiveM เปิด ALLOW_INVALID_DATES ดีไหม

ไม่ควรใช้เป็นวิธีแก้ Resourceทั่วไป

MariaDB ระบุว่า Mode นี้สามารถยอมรับ Invalid Dates บางแบบ และยังเตือนว่า Data ที่ถูก Insertภายใต้ Mode นี้สามารถมี Behaviorไม่แน่นอนเมื่อเปลี่ยน Modeภายหลัง.

แก้ Input Validation ดีกว่า

FAQ FiveM MariaDB Error 1292

Error 1292 คืออะไร?

MariaDB Error 1292 คือ ER_TRUNCATED_WRONG_VALUE ใช้ SQLSTATE 22007.

Incorrect datetime value เกิดจากอะไร?

มักเกิดจาก Date/Datetime Value ไม่ตรง Format, วันที่ไม่มีจริง, Value คนละ Type, Schema ไม่ตรง Resource หรือ SQL Mode ที่เข้มขึ้น

DATE ใช้ Format อะไร?

โดยทั่วไปใช้:

YYYY-MM-DD

DATETIME ใช้ Format อะไร?

โดยทั่วไปใช้ Date+Time เช่น:

YYYY-MM-DD HH:MM:SS

Empty String ใช้แทนวันที่ว่างได้ไหม?

ไม่ควรถือว่าเหมือน NULL เพราะ MariaDB ระบุว่า NULL, Empty String และ Zero Value เป็นคนละค่า.

0000-00-00 ใช้ได้ไหม?

Behavior ขึ้นกับ SQL Mode โดย NO_ZERO_DATE และ Mode ที่เกี่ยวข้องมีผลต่อ Zero Dates.

วันที่ 2026-02-31 ใช้ได้ไหม?

เป็น Invalid Calendar Date ตามปกติ แม้ ALLOW_INVALID_DATES สามารถเปลี่ยน Behavior บางส่วนได้ แต่ไม่ควรใช้ Mode นี้เพื่อซ่อน Resource Bug.

Unix Timestamp กับ DATETIME เหมือนกันไหม?

ไม่ Unix Timestamp เป็น Numeric Representation ของเวลา ส่วน DATETIME เป็น Temporal Data Type ต้องกำหนด Conversion Strategy ให้ชัด

Seconds กับ Milliseconds ต่างกันไหม?

ต่างกัน 1,000 เท่า จึงเป็นสาเหตุสำคัญของ Timestamp Bugs เมื่อ Library/Resource ใช้หน่วยไม่ตรงกัน

FROM_UNIXTIME ใช้ได้ไหม?

ได้ แต่ค่าอยู่ภายใต้ข้อจำกัดของ Temporal/TIMESTAMP Range ที่ MariaDB รองรับ.

ใช้ NOW() ได้ไหม?

ได้เมื่อ Requirementคือ Current Database Time.

Error หลังย้าย VPS เกิดจาก SQL_MODE ได้ไหม?

ได้ เพราะ SQL Modes มีผลต่อ Invalid Dates และ Zero Dates.

ควรปิด Strict/Date Mode เพื่อแก้ไหม?

ไม่ควรเป็นขั้นแรก ควรแก้ Date Value, Resource Logic และ Schema ให้ตรงก่อน

ประเด็นสำคัญ

เมื่อ FiveM Console ขึ้น:

Incorrect datetime value

หรือ:

Error 1292
Truncated incorrect datetime value

ให้ใช้สูตรนี้:

1292
↓
ดู Value
↓
ดู Column
↓
ดู DATE / DATETIME / TIMESTAMP / YEAR
↓
ตรวจ Format
↓
ตรวจวันที่มีจริง
↓
ตรวจ NULL / Empty String / Zero Date
↓
ตรวจ Seconds / Milliseconds
↓
ตรวจ Parameters
↓
ตรวจ Migration
↓
ตรวจ SQL_MODE

MariaDB กำหนด Error 1292 เป็น ER_TRUNCATED_WRONG_VALUE และ SQL Modes อย่าง ALLOW_INVALID_DATES, NO_ZERO_DATE และ NO_ZERO_IN_DATE สามารถเปลี่ยนวิธีที่ Server จัดการ Temporal Values ได้.

สำหรับ FiveM Resource ควรทำให้วันเวลามี Format และหน่วยเดียวกันทั้งระบบ โดยเฉพาะอย่าปะปน DD/MM/YYYY, SQL DATETIME, Unix Seconds และ Unix Milliseconds โดยไม่มี Conversion Layer ที่ชัดเจน

สำหรับผู้อ่าน comsiam ให้จำสูตร “1292 → ดูวันที่ที่ส่งจริงก่อนเปลี่ยน Database” และ comsiam แนะนำให้ตรวจ Value + Column Type + Parameter + SQL_MODE พร้อมกัน เพราะ Error วันเวลาจำนวนมากเกิดจาก Resource กับ Database ใช้ Date Contract คนละแบบ ไม่ใช่ MariaDB เสีย

Comments

Popular posts from this blog

FiveM ยังน่าเล่นไหม? Enhanced เปลี่ยน FiveM แค่ไหน

FiveM คืออะไร เล่นอย่างไร สำหรับมือใหม่ เริ่มต้นตั้งแต่ศูนย์

วิธีตั้ง Admin Permission ด้วย add_ace และ add_principal FiveM แบบละเอียด