Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 04:28 28.05.24 
Клубове/ Компютри и Интернет / Бази данни Всички теми Следваща тема Пълен преглед*
Информация за клуба
Тема 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.

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



Цялата тема
ТемаАвторПубликувано
* DATE() in MySQL 5.0.45 mr.vain   03.08.07 16:34
. * Re: DATE() in MySQL 5.0.45 wqw   03.08.07 17:05
. * Re: DATE() in MySQL 5.0.45 jgmec   09.08.07 00:21
. * Re: DATE() in MySQL 5.0.45 mcdev   09.08.07 10:21
. * Re: DATE() in MySQL 5.0.45 mr.vain   24.08.07 08:44
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.