|
Тема |
Re: DATE() in MySQL 5.0.45 [re: mr.vain] |
|
Автор |
mcdev (непознат
) |
|
Публикувано | 09.08.07 10:21 |
|
|
Здрасти, приятелче!
Ще се опитам да помогна. Първо, за това което казваш имам единствено обяснение, но нека първо видим при мен как е.
mysql> describe tstest;
+-------+-----------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-------+
| ts | timestamp | NO | MUL | CURRENT_TIMESTAMP | |
+-------+-----------+------+-----+-------------------+-------+
1 row in set (0.00 sec)
mysql> select version();
+------------+
| version() |
+------------+
| 5.0.45-log |
+------------+
1 row in set (0.00 sec)
mysql> select * from tstest WHERE DATE(ts) = '2007-07-28';
+---------------------+
| ts |
+---------------------+
| 2007-07-28 12:23:00 |
+---------------------+
1 row in set (0.01 sec)
Както виждаш, става.
Единственото, което ми хрумва в твоя случай е, че time zone на сървъра се е променила. TIMESTAMP колонките се пазят в UTC като 4 байта и при връщане се смятат спрямо зоната на сесията. Ето, виж в моя случай какво би се получило:
mysql> update tstest set ts = '2007-07-28 00:00:00';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select @@session.time_zone;
+---------------------+
| @@session.time_zone |
+---------------------+
| SYSTEM |
+---------------------+
1 row in set (0.00 sec)
mysql> set @@session.time_zone='+00:00';
Query OK, 0 rows affected (0.06 sec)
mysql> select * from tstest WHERE DATE(ts) = '2007-07-28';
Empty set (0.00 sec)
mysql> set @@session.time_zone='SYSTEM';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from tstest WHERE DATE(ts) = '2007-07-28';
+---------------------+
| ts |
+---------------------+
| 2007-07-28 00:00:00 |
+---------------------+
1 row in set (0.00 sec)
Това, че си решил да търсиш така по timestamp обаче, е много лошо решение. Води до изчисления за ВСЕКИ ред, освен това би предодвратило използването на индекси по колонката ти (ако има такива), което при големи таблици е сериозен удар по производителността.
Препоръчвам ти да ползваш нещо от сорта:
WHERE ts >= '2007-07-08 00:00:00' and ts =< '2007-07-08 23:59'
Което би довело до range scan, което е доста по-бързо, особено при таблици от тип InnoDB.
Дано съм бил полезен!
Поздрави!
|
| |
|
|
|