Страница 1 из 1

Опять mysql со своими приколами.

Добавлено: 2007-07-02 12:23:44
dikens3
Есть два запроса в которых диапазон дат разный:

Код: Выделить всё

mysql> SELECT count(1) FROM log WHERE ( dst_email LIKE '%user@domain.%' ) AND (`date-time` BETWEEN '2007-06-30' AND '2007-07-01' + INTERVAL 1 DAY) AND `size` IS NULL;
+----------+
| count(1) |
+----------+
|      178 |
+----------+
1 row in set (0.05 sec)

mysql> SELECT count(1) FROM log WHERE ( dst_email LIKE '%user@domain.%' ) AND (`date-time` BETWEEN '2007-06-31' AND '2007-06-31' + INTERVAL 1 DAY) AND `size` IS NULL;
+----------+
| count(1) |
+----------+
|      178 |
+----------+
1 row in set (0.06 sec)
В первом запросе выборка с 30 июня по 1 июля(включительно, т.е. до 2 июля)
Во втором на 31 июня(такой даты нет в базе) и выборка отображает с 30 по 1. В чём прикол?
Разбираясь дальше нашёл вот что:

Код: Выделить всё

select '2007-06-31' + INTERVAL 1 DAY;
+-------------------------------+
| '2007-06-31' + INTERVAL 1 DAY |
+-------------------------------+
| 2007-07-02                    |
+-------------------------------+
1 row in set (0.00 sec)
Т.е. если к несуществующей дате прибавить 1 день, то mysql делает дату существующей(его об этом просят?) и прибавляет 1 день.

Добавлено: 2007-07-02 13:23:51
hizel
может из за того что в июне 30 дней =/

Добавлено: 2007-07-02 13:27:41
dikens3
hizel писал(а):может из за того что в июне 30 дней =/
Я знаю сколько в июне дней.
Вопрос в том, что нафига делать за меня работу, которую я не просил? и тем самым у меня неправильно отрабатывает запрос. Мать его так этот mysql.
Сидел ведь на postgresql, не знал проблем никогда. Полез... :-(

Даже больше скажу, что не mysql этим нужно заниматься. К примеру у меня есть в базе данных какой-то текст. Например:

ПРЕВЕД!!!

И он его не найдет, т.к. в его словаре нет такого слова?

Добавлено: 2007-07-02 14:08:30
Alex Keda
неплохо бы проверять данные перед тем как отдавать их запросу.
в т.ч. и корректность данных.

Добавлено: 2007-07-02 14:19:05
dikens3
lissyara писал(а):неплохо бы проверять данные перед тем как отдавать их запросу.
в т.ч. и корректность данных.
ПРЕВЕД корректно? А если не найдёт?
Дней в месяце может быть 28-31. Лень мне свою проверку писать из-за того что MYSQL тупой.
Видать так и придётся.

И ещё, нужно для внутреннего пользования и учитывать что пользователь будет пытаться стать хакером и введёт дату 2100 год и месяц 16 не имеет смысла, ибо ему mysql должен будет показать пустые поля.(даты такой в базе нет !!! ) И кстати, почему можно ввести 2100 год (не пробовал, но думаю можно), а 31 июня нельзя? Может завтра в июне будет 31 день?

P.S. Дату и т.п. пользователь выбирает. JavaScript я не знаю и находу проверить не могу(т.е. скрыть некоторые даты после выбора месяца.)

Добавлено: 2007-07-02 15:25:05
lexy
dikens3 писал(а):
lissyara писал(а):неплохо бы проверять данные перед тем как отдавать их запросу.
в т.ч. и корректность данных.
ПРЕВЕД корректно? А если не найдёт?
Дней в месяце может быть 28-31. Лень мне свою проверку писать из-за того что MYSQL тупой.
Видать так и придётся.

И ещё, нужно для внутреннего пользования и учитывать что пользователь будет пытаться стать хакером и введёт дату 2100 год и месяц 16 не имеет смысла, ибо ему mysql должен будет показать пустые поля.(даты такой в базе нет !!! ) И кстати, почему можно ввести 2100 год (не пробовал, но думаю можно), а 31 июня нельзя? Может завтра в июне будет 31 день?

P.S. Дату и т.п. пользователь выбирает. JavaScript я не знаю и находу проверить не могу(т.е. скрыть некоторые даты после выбора месяца.)
проверяй на стороне сервера тогда данные, а проще - сделай селектор дат (о! у меня ж есть..... сча, вспомню в каком проекте и выложу)

Добавлено: 2007-07-02 16:00:07
lexy
держи вот!

Код: Выделить всё

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ru">
<head>

  <meta http-equiv="Content-Type" content="text/html; charset=koi-8r" />
  <title>Итфвюнепке - Прюрхжк</title>


  <link href="/manage/manage.css" rel="stylesheet" type="text/css" />

</head>


<body>

<select name="day" id="day">
</select>

<select name="month" id="month" onchange="setDays(this.value)">
<option value="1">Январь</option>
<option value="2">Феврфль</option>
<option value="3">Март</option>
<option value="4">Апрель</option>
<option value="5">Май</option>
<option value="6">Июнь</option>

<option value="7">Июль</option>
<option value="8">Август</option>
<option value="9">Сентябрь</option>
<option value="10">Октябрь</option>
<option value="11">Ноябрь</option>
<option value="12">Декабрь</option>
</select>

<select name="year" id="year" onchange="setDays(month.value)">
<option value="2006">2006</option>

<option value="2007">2007</option>
<option value="2008">2008</option>
<option value="2009">2009</option>
<option value="2010">2010</option>
<option value="2011">2011</option>
<option value="2012">2012</option>
<option value="2013">2013</option>
<option value="2014">2014</option>
<option value="2015">2015</option>

</select>

<script language="javascript1.1">
<!--//
function setDays(month){
var days_count=new Array(31,28,31,30,31,30,31,31,30,31,30,31);
odS=od.selectedIndex
if(month==2) {dcn=oy.value%4?28:29 }else{ dcn=days_count[month-1]}
while (od.length> 0) {
od.remove(0);
} for(i=1;i<=dcn;i++){
od.options[i]= new Option(i,i,false,false)
}
od.selectedIndex=((od.length-1)<=odS)?od.length-1:odS;
}
var oy=document.getElementById('year');
var om=document.getElementById('month');
var od=document.getElementById('day');
<?
//initialize date selector by PHP
$mf=($date)?date('n',$date):date('n');
echo("om.value=$mf\r\n");
$yf=($date)?date('Y',$date):date('Y');
echo("oy.value=$yf; setDays(om.value);\r\n");
$df=($date)?date('j',$date):date('j');
echo("od.value=$df\r\n");
?>
//-->
</script>
</body>
</html

Добавлено: 2007-07-02 16:24:56
dikens3
Хм.. Ну спасибо что-ли. Буду пробовать.

Добавлено: 2007-07-02 22:33:21
Alex Keda

Код: Выделить всё

$mf=($date)?date('n',$date):date('n'); 
ненавижу такой синтаксис... :)

Добавлено: 2007-07-03 6:29:48
lexy
lissyara писал(а): ненавижу такой синтаксис... :)
ты еще других моих конструкций не видел, я еще, стыдно признаться :oops: , и вот такое использую

Код: Выделить всё

<?=$variable?>
и, не поверишь, работает!!!! ))))))))))))))

Добавлено: 2007-07-03 7:55:17
Alex Keda
и это видел...
=======
я вообще непонимаю этой моды на короткий синтаксис...
код нечитаем становится...

Добавлено: 2007-07-03 8:54:34
lexy
смотря для чего пишешь - если для обучалова - то да, для быстроты кодинга всеж меньше символов - быстрее написал.

++++++++++++++++

я как то вот по такому коду и учился, ковырял другие скрипты, допиливал под себя. Я потому WYSIWYG вебредактор и искал, что сначала пишу представление визуальное, а потом вписываю в него динамику, быстро и стабильно получается. А выгонять HTML код из PHP при помощи echo это изврат я считаю. PHP не для этого создавался а для интеграции динамической генерации и визуального представления. Эхами можно в перле выгнать ))))) хотя у него там тож есть пакет для шаблонов страниц вроде. )))))), кста, PHP1 был написан на перле ))))

сорри за оф-топ

Добавлено: 2007-07-03 9:02:39
Alex Keda
у меня вся страница в конце собирается в переменную, и её содержимое выводится через эхо...
Когда-то - да - кусочками код выводил :)

Добавлено: 2007-07-03 9:03:34
Alex Keda
кстати - вру, надо утчнять - помоему у меня она в двух вариантах - либо на сжатие уходит, и оттуда как бинарная идёт юзеру, либо чеерз эхо - если сжатие не поддерживается.

Добавлено: 2007-07-03 11:47:01
dikens3
Я тут подумал, хорошо ещё что каждый месяц начинается с 1-но числа. А то вообще ппц.

Добавлено: 2007-07-03 12:06:03
lexy
dikens3 писал(а):Я тут подумал, хорошо ещё что каждый месяц начинается с 1-но числа. А то вообще ппц.
ИМХО ты зря на MySQL гонишь! Это всего лишь СУБД, а не date|time validator :D

ЗЫ. Вот так, доблестным флудом заслужил себе еще одну лычку! :lol:

Добавлено: 2007-07-03 12:59:52
dikens3
Дык ведь он валидатором и работает, хотя не просят и работает при этом неправильно.
Я уже задолбался запросы подгонять под индексы.(И индексы под запросы)

P.S. Проблему с датой на 1 день решил добавлением ещё 1 поля (date и вносим CURDATE()) в mysql (избыточно конечно, но данных не много)
И изменением запросов к этому полю на дату без интервала, т.е. стало
WHERE `date` = '2007-06-31'
И всё работает.

Добавлено: 2007-07-04 11:12:23
lexy
dikens3 писал(а):Дык ведь он валидатором и работает, хотя не просят и работает при этом неправильно.
Я уже задолбался запросы подгонять под индексы.(И индексы под запросы)
в одной програмерской никсовой фирме у программеров висел плакат "Долой оптимизацию" :lol:
ИМХО майскл сам оптимизирует запрос и решает, а нужно ли использовать индексы или нет
dikens3 писал(а):P.S. Проблему с датой на 1 день решил добавлением ещё 1 поля (date и вносим CURDATE()) в mysql (избыточно конечно, но данных не много)
И изменением запросов к этому полю на дату без интервала, т.е. стало
WHERE `date` = '2007-06-31'
И всё работает.

Это уже смахивает на анекдот про суровых сибирских лесорубов и японскую пилораму:
...запихнули в нее лом, хррр сказала машина и сдохла, "АААА бля" сказали суровые сибирские лесорубы!

анекдот о том, что пользовательские данные должны проверятся перед обработкой :D

Добавлено: 2007-07-04 11:18:52
dikens3
анекдот о том, что пользовательские данные должны проверятся перед обработкой
Согласен, с Mysql анекдот, только вот выхода пока нет. База должна нормально отрабатывать мои данные, нафига писать проверку?
MySQL кривой. Буду что-то новое делать, больше с ним не свяжусь.
А оптимизатор есть наверное у всех, только у Mysql он гавно полное. По другому сказать нельзя.

Добавлено: 2007-07-04 11:48:27
lexy
ну хз.... 5 лет мускел пользую (мощно, с большими таблицами) и ниччо..... все устраивает
идеальных вещей не бывает.

Re: Опять mysql со своими приколами.

Добавлено: 2007-07-24 7:58:07
Sw%00p
dikens3 всётаки тупой не мускул а ты

Код: Выделить всё

select '2007-06-31' + INTERVAL 1 DAY;
+-------------------------------+
| '2007-06-31' + INTERVAL 1 DAY |
+-------------------------------+
| 2007-07-02                    |
+-------------------------------+
1 row in set (0.00 sec)
ты задавался вопросом почему датав мускуле пишется именно так 2007-07-02 (сначало год месяц и день)
и думаешь мускул не знает что в июне 30 дней а не 31 и не должен же он тебе сделать дату 30 и потом прибавить 1 чтобы получилось 07-01 он видит неправильную дату 06-31 исправляет её до следующей правильной даты 07-01 и прибавляет 1

и совет задай этот вопрос создателям мускула ))))) мускул это тебе не то что хочу ввожу это расчитанно на то что если вдруг по ошибке ты так введёшь то он тебе правильно сформирует вывод

Re: Опять mysql со своими приколами.

Добавлено: 2007-07-27 17:01:23
dikens3
и совет задай этот вопрос создателям мускула ))))) мускул это тебе не то что хочу ввожу это расчитанно на то что если вдруг по ошибке ты так введёшь то он тебе правильно сформирует вывод
Ещё раз повторю для особо одарённых.
Когда я говорю ПРЕВЕД - это означает ПРИВЕТ и плевать мне на правильно это по мнению создателей mysql или нет. А так же куда они там и что подгоняют, а также на то, есть ли у них такое слово в словаре вообще. (Аналог количества дней в июне, июле и т.п.)

Тема закрыта.

Re: Опять mysql со своими приколами.

Добавлено: 2007-07-27 18:35:29
Alex Keda
я конечно извиняюсь, что лезу в закрытую тему, но всё же - может над писать запросы без ошибок? :)))
===========
как женатая жизнь, лучше поделись :)