Thursday, December 22, 2005

MySQL 5.0.16 บน Windows XP งงหวะ

เริ่มต้น มี Table อันนึงชื่อ events
mysql> select mytime from events;
+---------------------+
| mytime              |
+---------------------+
| 2005-12-22 16:07:01 |
| 2005-12-22 16:18:54 |
| 2005-12-22 16:18:58 |
| 2005-12-22 16:19:02 |
| 2005-12-22 19:42:31 |
| 2005-12-22 19:42:31 |
| 2005-12-22 19:42:31 |
+---------------------+
7 rows in set (0.00 sec)
ชนิดของ mytime คือ timestamp

ทีนี้แกล้งใส่เงื่อนไขเวลา

mysql> select mytime from events 
  where mytime < '9999-12-31 23:59:59' and 
  mytime > '1-1-1 0:0:0';
Empty set, 4 warnings (0.00 sec)
หรือว่า > < ใช้ไม่ได้กับวันที่ ? ลองให้มันคำนวนค่าหลัง WHERE ดู
mysql> select (mytime < '9999-12-31 23:59:59' and 
  mytime > '1-1-1 0:0:0') logic from events;
+-------+
| logic |
+-------+
|     1 |
|     1 |
|     1 |
|     1 |
|     1 |
|     1 |
|     1 |
+-------+
7 rows in set, 2 warnings (0.00 sec)
ก็เป็น 1 นี่หว่า !

ลองเช็คว่าเป็น 1 หรือเปล่าแทน

mysql> select mytime from events 
  where (mytime < '9999-12-31 23:59:59' and mytime > '1-1-1 0:0:0')=1;
+---------------------+
| mytime              |
+---------------------+
| 2005-12-22 16:07:01 |
| 2005-12-22 16:18:54 |
| 2005-12-22 16:18:58 |
| 2005-12-22 16:19:02 |
| 2005-12-22 19:42:31 |
| 2005-12-22 19:42:31 |
| 2005-12-22 19:42:31 |
+---------------------+
7 rows in set, 2 warnings (0.00 sec)
อ้าว ดันได้ผล

1 กับ TRUE ไม่เหมือนกันเหรอ ?

mysql> select 2=2;
+-----+
| 2=2 |
+-----+
|   1 |
+-----+
1 row in set (0.00 sec)
สรุปว่า งง เป็น MySQL 5.0.16 บน Windows XP

WARNINGS

เห็นมี Warning ออกมา ก็เลยลอง

mysql> show warnings;
| Warning | 1292 | Incorrect datetime value: '9999-12-31 23:59:59' for column 'mytime' at row 1 |
| Warning | 1292 | Incorrect datetime value: '1-1-1 0:0:0' for column 'mytime' at row 1         |
OK ค่าอาจจะน่าเกลียด แต่ผลข้างบนก็ขัดแย้งกันเอง

ลองค้นหาข้อมูลเพิ่มเติมดู พบว่าในหน้า 11.3.1. The DATETIME, DATE, and TIMESTAMP Types บอกว่า สำหรับข้อมูลแบบ DATETIME

The supported range is '1000-01-01 00:00:00' to '9999-12-31 23:59:59'. 
แต่สำหรับข้อมูลแบบ TIMESTAMP
...
TIMESTAMP values cannot be earlier than 1970 or later than 2037.
...
ตกลงเลยต้องเปลี่ยนเป็น
mysql> select id, mytime from events where 
   (mytime < '2036-12-31 23:59:59') and 
   (mytime > '1971-1-1 0:0:0');
+----+---------------------+
| id | mytime              |
+----+---------------------+
|  1 | 2005-12-22 16:07:01 |
|  2 | 2005-12-22 16:18:54 |
|  3 | 2005-12-22 16:18:58 |
|  4 | 2005-12-22 16:19:02 |
|  5 | 2005-12-22 19:42:31 |
|  6 | 2005-12-22 19:42:31 |
|  7 | 2005-12-22 19:42:31 |
+----+---------------------+
7 rows in set (0.00 sec)
ลองใช้ '1970-1-1 0:0:0' กับ '2037-12-31 23:59:59' ยังมี WARNINGS

1 comment:

zendz said...

มิน่าทำไมผม import data บน windowsXP ไม่ได้ แต่บน linux มันทำได้เพราะอย่างนี้นี่เอง

แต่ว่ามันทำเพื่อะไร งง