DATE() in MySQL 5.0.45
4 отговора
0 прегледа
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 където се появи този проблем... Има ли някаква несъвместимост между версиите или проблема е в мен (въпреки, че единствената промяна е във версиите, всичко друго е идентично).
Благодаря ви предватително!
Има три вида хора. Част от проблема, част от решението и част от пейзажа.
Не съм сигурен дали въпроса ми е коректен, но имам следния странен проблем. При прилагане на 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 на
Re: DATE() in MySQL 5.0.45
Canonical ODBC формат работи ли? i.e. '20070728'
cheers,
</wqw>
[линк]
cheers,
</wqw>
[линк]
Re: DATE() in MySQL 5.0.45
А защо не опиташ да смениш типа на колоната - така както си го написал, ако има повечко редове в таблицата ще падне голямо смятане.
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.
Дано съм бил полезен!
Поздрави!
Ще се опитам да помогна. Първо, за това което казваш имам единствено обяснение, но нека първо видим при мен как е.
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
Привет!
Оказа се, че има бъг с DATE() функцията от 5.0.42 нагоре (включително и в 0.45):
[линк]
Така или иначе благодаря за съветите, ще се възползвам! :)
Има три вида хора. Част от проблема, част от решението и част от пейзажа.
Оказа се, че има бъг с DATE() функцията от 5.0.42 нагоре (включително и в 0.45):
[линк]
Така или иначе благодаря за съветите, ще се възползвам! :)
Има три вида хора. Част от проблема, част от решението и част от пейзажа.