DATE() in MySQL 5.0.45

4 отговора 0 прегледа
#1

DATE() in MySQL 5.0.45

Здравейте отново!

Не съм сигурен дали въпроса ми е коректен, но имам следния странен проблем. При прилагане на 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 на

Отговор
в отговор на mr.vain #2

Re: DATE() in MySQL 5.0.45

Canonical ODBC формат работи ли? i.e. '20070728'

cheers,
</wqw>


[линк]
Отговор
в отговор на mr.vain #3

Re: DATE() in MySQL 5.0.45

А защо не опиташ да смениш типа на колоната - така както си го написал, ако има повечко редове в таблицата ще падне голямо смятане.

Отговор
в отговор на mr.vain #4

Re: DATE() in MySQL 5.0.45

Здрасти, приятелче!

Ще се опитам да помогна. Първо, за това което казваш имам единствено обяснение, но нека първо видим при мен как е.

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.

Дано съм бил полезен!
Поздрави!

Отговор
в отговор на mcdev #5

Re: DATE() in MySQL 5.0.45

Привет!

Оказа се, че има бъг с DATE() функцията от 5.0.42 нагоре (включително и в 0.45):

[линк]

Така или иначе благодаря за съветите, ще се възползвам! :)

Има три вида хора. Част от проблема, част от решението и част от пейзажа.
Отговор