|
Тема
|
DATE() in MySQL 5.0.45
|
|
Автор |
mr.vain (пътник 57) |
Публикувано | 03.08.07 16:34 |
|
Здравейте отново!
Не съм сигурен дали въпроса ми е коректен, но имам следния странен проблем. При прилагане на DATE() върху TIMESTAMP колона, например:
WHERE DATE(updateDate) = '2007-07-28'
MySQL-a не връща нищо...!
Ако в заявката използвам DATE_FORMAT, т.е.:
WHERE DATE_DORMAT(updateDate,'%Y-%m-%d') = '2007-07-28'
всичко е ОК.
Доскоро бях с 5.0.37 където всичко беше наред. По препоръка на вещите лица преминах на 5.0.45 където се появи този проблем... Има ли някаква несъвместимост между версиите или проблема е в мен (въпреки, че единствената промяна е във версиите, всичко друго е идентично).
Благодаря ви предватително!
Има три вида хора. Част от проблема, част от решението и част от пейзажа.Редактирано от mr.vain на 03.08.07 16:35.
| |
Тема
|
Re: DATE() in MySQL 5.0.45
[re: mr.vain]
|
|
Автор |
wqw (АзСъмЖив) |
Публикувано | 03.08.07 17:05 |
|
Canonical ODBC формат работи ли? i.e. '20070728'
cheers,
</wqw>
| |
Тема
|
Re: DATE() in MySQL 5.0.45
[re: mr.vain]
|
|
Автор |
jgmec (непознат
) |
Публикувано | 09.08.07 00:21 |
|
А защо не опиташ да смениш типа на колоната - така както си го написал, ако има повечко редове в таблицата ще падне голямо смятане.
| |
Тема
|
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.
Дано съм бил полезен!
Поздрави!
| |
Тема
|
Re: DATE() in MySQL 5.0.45
[re: mcdev]
|
|
Автор |
mr.vain (пътник 57) |
Публикувано | 24.08.07 08:44 |
|
Привет!
Оказа се, че има бъг с DATE() функцията от 5.0.42 нагоре (включително и в 0.45):
http://bugs.mysql.com/bug.php?id=29898
Така или иначе благодаря за съветите, ще се възползвам! :)
Има три вида хора. Част от проблема, част от решението и част от пейзажа.
| |
|
|
|
|