0 Пользователей и 1 Гость просматривают эту тему.
  • 18 Ответов
  • 1131 Просмотров
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Как написать запрос с использованием OR в where?
Вот запрос который не работает.

Спойлер
[свернуть]

Если точнее вот этот кусок интресует

Код: php-brief
			$query->where('a.over_image='. $db->q( $this->getState('message.check_status') ).'' );
$query->where('a.over_starttime <= (STR_TO_DATE(\'' . date('Y-m-d H:M:S').'\', \'%Y-%m-%d %H:%i:%s\'))' );
$query->where('( a.over_endtime >= (STR_TO_DATE(\'' . date('Y-m-d H:M:S').'\', \'%Y-%m-%d %H:%i:%s\'))
OR a.over_endtime = (STR_TO_DATE(\'0000-00-00 00:00:00\', \'%Y-%m-%d %H:%i:%s\')) )
');
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: SQL запрос в оператором OR в where
« Ответ #1 : 28.11.2016, 01:54:11 »
$query->where('a.over_image='$db->q$this->getState('message.check_status') ) );
$query->where('a.over_starttime <= ' $query->currentTimestamp() );
$query->where('( a.over_endtime >= ' $query->currentTimestamp(). ') OR (a.over_endtime = "0000-00-00 00:00:00")' );


условия для OR и AND заключаются в кавычки

если вы хотите подставить текущее время, то вставьте просто $query->currentTimestamp(), если вы хотите конкретное время задать, то укажите просто строку в известном вам формате, строки указываются в двойных кавычках, $query->currentTimestamp() двойными кавычками обрамлять не надо
пруф: https://api.joomla.org/cms-3/classes/JDatabaseQuery.html
« Последнее редактирование: 28.11.2016, 02:05:20 от AlekVolsk »
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: SQL запрос в оператором OR в where
« Ответ #2 : 28.11.2016, 10:36:26 »
Поправлю вас. Структура моя правильная была, а вот в условиях что-то накосячино.

Собственно вот рапрос который отработал правильно:
Код: php-brief
			$query->where('a.over_starttime <=' . $query->currentTimestamp());
$query->where('( a.over_endtime >=' . $query->currentTimestamp().'  OR  a.over_endtime = "0000-00-00 00:00:00" )');
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Re: SQL запрос в оператором OR в where
« Ответ #3 : 28.11.2016, 12:08:54 »
Код: php-brief
 "0000-00-00 00:00:00"
Так удобнее
Код: php
JFactory::getDbo()->getNullDate()
Ну а для текущий можно так
Код: php
JFactory::getDate()->toSql()
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: SQL запрос в оператором OR в where
« Ответ #4 : 28.11.2016, 15:15:11 »
Так удобнее
Код: php
JFactory::getDbo()->getNullDate()
Ну а для текущий можно так
Код: php
JFactory::getDate()->toSql()
нет, так не удобнее:
1) нафига для нулевой даты делать вызов функции, когда это вообще константное значение
2) $query->currentTimestamp() работает быстрее, работает напрямую в едином пространстве запроса, вариант с фабрикой в данном случае - чуточку через назад
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Re: SQL запрос в оператором OR в where
« Ответ #5 : 28.11.2016, 15:25:48 »
1) нафига для нулевой даты делать вызов функции, когда это вообще константное значение
Читать да и писать удобнее учитывая что чаще всего пишется так
Код: php
$db->getNullDate()
2) $query->currentTimestamp() работает быстрее, работает напрямую в едином пространстве запроса, вариант с фабрикой в данном случае - чуточку через назад
А оно учитывает высталенную пользователем временную зону, но я тут не уверен, просто в свое время когда учился подглядел это в каком-то компоненте (для publish_up)в от и юзаю с тех пор
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: SQL запрос в оператором OR в where
« Ответ #6 : 28.11.2016, 15:31:22 »
$query->currentTimestamp() работает быстрее
Еще быстрее: CURRENT_TIMESTAMP() или NOW() :).
Не будь паразитом, сделай что-нибудь самостоятельно!
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: SQL запрос в оператором OR в where
« Ответ #7 : 28.11.2016, 15:42:17 »
Цитировать
Еще быстрее: CURRENT_TIMESTAMP() или NOW()

Согласен. Почему не использовать функции MySQL? К тому же зачем в одном и том же месте вызывать $query->currentTimestamp() несколько раз. Запишите значение в переменную и используйте ее.
« Последнее редактирование: 28.11.2016, 15:45:54 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: SQL запрос в оператором OR в where
« Ответ #8 : 28.11.2016, 21:49:02 »
А оно учитывает высталенную пользователем временную зону, но я тут не уверен, просто в свое время когда учился подглядел это в каком-то компоненте (для publish_up)в от и юзаю с тех пор
да, учитывает

Еще быстрее: CURRENT_TIMESTAMP() или NOW() :).
тоже верно, но тут как раз не учитывается временная зона пользователя )

К тому же зачем в одном и том же месте вызывать $query->currentTimestamp() несколько раз. Запишите значение в переменную и используйте ее.
так же верно, но мне лень было расписывать: я тупо скопипастил строчку и подставил ее вместо того г, что было дано изначально
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: SQL запрос в оператором OR в where
« Ответ #9 : 28.11.2016, 22:11:19 »
Я посмотрел, эта функция всего лишь обертка для MySQL функции:

https://github.com/joomla/joomla-cms/blob/staging/libraries/joomla/database/query.php#L638

Соответственно и временная зона будет та что установлена в мускуле (по дефолту это время которое установлено на сервере) и оно конечно может отличатся от той зоны что установлена в админке Joomla. Да и кстатии результат еще будет зависеть от типа поля в БД timestamp или datetime. Datetime хранит дату как есть и временную зону не учитывает
« Последнее редактирование: 28.11.2016, 22:23:02 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
Re: SQL запрос в оператором OR в where
« Ответ #10 : 28.11.2016, 22:55:51 »
вот хрень... в свое время я наблюдал совсем другой код...
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: SQL запрос в оператором OR в where
« Ответ #11 : 29.11.2016, 10:10:16 »
Datetime хранит дату как есть и временную зону не учитывает
Это да, но по факту всё зависит от того, как туда её запишешь. Часто на форуме всплывает тема с датами и очень многие пишут туда не UTC, что очень плохо.

Если нужно учитывать временную зону, то используйте метод date() класса JHtml, который конвертирует UTC, учитывая настройки.

Временная зона пользователя:
Код: php
$now = JHtml::_('date', 'now', $db->getDateFormat());

Временная зона из админки Joomla:
Код: php
$now = JHtml::_('date', 'now', $db->getDateFormat(), false);

Если чистый UTC, то:
Код: php
$now = JFactory::getDate('now', 'UTC')->toSql();
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: SQL запрос в оператором OR в where
« Ответ #12 : 29.11.2016, 15:22:12 »
Можно также использовать функцию MySQL UTC_TIMESTAMP(), если при этом на сервере установлена правильная временная зона. Она кстатии должна совпадать с той зоной что установлена в админке чтобы не было никаких проблем.
интернет-блог: http://websiteprog.ru
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Re: SQL запрос в оператором OR в where
« Ответ #13 : 29.11.2016, 15:23:16 »
Можно также использовать функцию MySQL UTC_TIMESTAMP(), если при этом на сервере установлена правильная временная зона. Она кстатии должна совпадать с той зоной что установлена в админке чтобы не было никаких проблем.
Каждый пользователь в профиле может выставить свою временную отличную от по умолчанию в админке, серверной и даже от зоны выставленной в его ОС, это тоже надо учитывать.

Какой вариант в итоге наиболее верный спорить не буду ибо даты лично для меня всегда были гемором, но почитать дискуссию на тему как же все таки верно, что все учесть с удовольствием почитаю
« Последнее редактирование: 29.11.2016, 15:30:10 от Septdir »
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: SQL запрос в оператором OR в where
« Ответ #14 : 29.11.2016, 16:47:52 »
Каждый пользователь в профиле может выставить свою временную отличную от по умолчанию в админке, серверной и даже от зоны выставленной в его ОС, это тоже надо учитывать.
этого никак не учесть :) если юзеру охота жить в -8 при том что реально он живет в +3 и время у него на компьютере +3 - то это его личное дело :)

Какой вариант в итоге наиболее верный спорить не буду ибо даты лично для меня всегда были гемором, но почитать дискуссию на тему как же все таки верно, что все учесть с удовольствием почитаю

верные варианты

Временная зона пользователя:
Код: php
$now = JHtml::_('date', 'now', $db->getDateFormat());

Временная зона из админки Joomla:
Код: php
$now = JHtml::_('date', 'now', $db->getDateFormat(), false);

Если чистый UTC, то:
Код: php
$now = JFactory::getDate('now', 'UTC')->toSql();

главное как уже сказали хранить в UTC, а не во времени юзера, и ни в каком другом чем попало. а если кого то угораздило на сервере иметь не
совпадать с той зоной что установлена в админке
то это тоже уже проблемы не Joomla, теперь это гемор админа, как он будет сохранять в UTC :)
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: SQL запрос в оператором OR в where
« Ответ #15 : 29.11.2016, 19:14:11 »
Тип поля timstamp всегда хранит время в UTC и гораздо больше подходит для хранения кратковременных дат. Если время на сервере устновлено правильно и правильно настроена временная зона в php то никаких дополнительно функций не требуется. Я честно незнаю почему разработчики Joomla использует datetime для хранения времени создания и обновления в таблицах и все эти функции преобразования
интернет-блог: http://websiteprog.ru
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: SQL запрос в оператором OR в where
« Ответ #16 : 30.11.2016, 18:07:02 »
Кстатии, если все же будете пользоваться встроенными функциями Joomla для хранения времени в utc то имейте ввиду:

Код: php
$db = JFactory::getDBO();
$current_timestamp = $db->getQuery(true)->currentTimestamp();
$utc_timestamp = 'UTC_TIMESTAMP()';
$now = JFactory::getDate('now', 'UTC')->toSql();
echo $db->setQuery('SELECT IF('. $current_timestamp .'='. $db->q($now). ', "true", "false" )')->loadResult();     //false
echo $db->setQuery('SELECT IF('. $utc_timestamp .'='. $db->q($now). ', "true", "false" )')->loadResult();         //true

Так как для $utc_timestamp у них встроенного метода нету, то создается ощущение что они сами хранят время не в utc. И вообщем то похоже так и есть:

https://github.com/joomla/joomla-cms/blob/staging/libraries/legacy/table/content.php#L318
« Последнее редактирование: 30.11.2016, 18:19:57 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: SQL запрос в оператором OR в where
« Ответ #18 : 30.11.2016, 18:26:47 »
Datetime больше подходит для хранения дат или исторический событий типа дней рождения и так далее, где временные зоны не важны. Timestamp помимо того что учитывает временные зоны, имеет еще некоторые встроенные функции для автоматического обновления текущей даты и больше подходит для хранения кратковременных дат: логи, даты создания/обновления. У каждого типа данных своя область применения, поэтому они и сосуществуют вместе, ИМХО.  
« Последнее редактирование: 30.11.2016, 18:31:23 от zomby6888 »
интернет-блог: http://websiteprog.ru
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

SQL запрос с JOIN LEFT use IN

Автор platonische

Ответов: 12
Просмотров: 685
Последний ответ 20.10.2017, 10:57:08
от platonische
Поиск на сайте - SQL запрос

Автор john.deff

Ответов: 11
Просмотров: 928
Последний ответ 08.08.2016, 10:08:29
от john.deff
Sql запрос JOIN и LIMIT

Автор platonische

Ответов: 6
Просмотров: 986
Последний ответ 06.04.2016, 14:31:09
от zomby6888
SQL запрос

Автор spirit1086

Ответов: 10
Просмотров: 1181
Последний ответ 13.02.2015, 11:22:53
от spirit1086
[Решено] Post запрос в модели компонента

Автор saharin88

Ответов: 11
Просмотров: 1768
Последний ответ 20.10.2014, 18:09:49
от saharin88