Форум русской поддержки Joomla!® CMS
08.12.2016, 04:18:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

SQL запрос в оператором OR в where

 (Прочитано 180 раз)
0 Пользователей и 1 Гость смотрят эту тему.
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« : 27.11.2016, 22:37:56 »

Как написать запрос с использованием OR в where?
Вот запрос который не работает.

Показать текстовый блок

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

Код
			$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
Профи
********

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6458



« Ответ #1 : 28.11.2016, 02: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, 03:05:20 от AlekVolsk » Записан
platonische
Давно я тут
****

Репутация: +0/-0
Offline Offline

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #2 : 28.11.2016, 11:36:26 »

Поправлю вас. Структура моя правильная была, а вот в условиях что-то накосячино.

Собственно вот рапрос который отработал правильно:
Код
			$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
Живу я здесь
******

Репутация: +35/-3
Offline Offline

Пол: Мужской
Сообщений: 838


Skype: septdir


« Ответ #3 : 28.11.2016, 13:08:54 »

Код
 "0000-00-00 00:00:00"
 
Так удобнее
Код
JFactory::getDbo()->getNullDate()
 
Ну а для текущий можно так
Код
JFactory::getDate()->toSql()
 
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6458



« Ответ #4 : 28.11.2016, 16:15:11 »

Так удобнее
Код
JFactory::getDbo()->getNullDate()
 
Ну а для текущий можно так
Код
JFactory::getDate()->toSql()
 
нет, так не удобнее:
1) нафига для нулевой даты делать вызов функции, когда это вообще константное значение
2) $query->currentTimestamp() работает быстрее, работает напрямую в едином пространстве запроса, вариант с фабрикой в данном случае - чуточку через назад
Записан
Septdir
Живу я здесь
******

Репутация: +35/-3
Offline Offline

Пол: Мужской
Сообщений: 838


Skype: septdir


« Ответ #5 : 28.11.2016, 16:25:48 »

1) нафига для нулевой даты делать вызов функции, когда это вообще константное значение
Читать да и писать удобнее учитывая что чаще всего пишется так
Код
$db->getNullDate()
 
2) $query->currentTimestamp() работает быстрее, работает напрямую в едином пространстве запроса, вариант с фабрикой в данном случае - чуточку через назад
А оно учитывает высталенную пользователем временную зону, но я тут не уверен, просто в свое время когда учился подглядел это в каком-то компоненте (для publish_up)в от и юзаю с тех пор
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3590


« Ответ #6 : 28.11.2016, 16:31:22 »

$query->currentTimestamp() работает быстрее
Еще быстрее: CURRENT_TIMESTAMP() или NOW() Azn.
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #7 : 28.11.2016, 16:42:17 »

Цитировать
Еще быстрее: CURRENT_TIMESTAMP() или NOW()

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

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6458



« Ответ #8 : 28.11.2016, 22:49:02 »

А оно учитывает высталенную пользователем временную зону, но я тут не уверен, просто в свое время когда учился подглядел это в каком-то компоненте (для publish_up)в от и юзаю с тех пор
да, учитывает

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

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

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #9 : 28.11.2016, 23:11:19 »

Я посмотрел, эта функция всего лишь обертка для MySQL функции:

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

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

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6458



« Ответ #10 : 28.11.2016, 23:55:51 »

вот хрень... в свое время я наблюдал совсем другой код...
Записан
b2z
Support Team
*****

Репутация: +710/-0
Offline Offline

Пол: Мужской
Сообщений: 7537


Разраблю понемногу


« Ответ #11 : 29.11.2016, 11:10:16 »

Datetime хранит дату как есть и временную зону не учитывает
Это да, но по факту всё зависит от того, как туда её запишешь. Часто на форуме всплывает тема с датами и очень многие пишут туда не UTC, что очень плохо.

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

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

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

Если чистый UTC, то:
Код
$now = JFactory::getDate('now', 'UTC')->toSql();
« Последнее редактирование: 29.11.2016, 11:23:20 от b2z » Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #12 : 29.11.2016, 16:22:12 »

Можно также использовать функцию MySQL UTC_TIMESTAMP(), если при этом на сервере установлена правильная временная зона. Она кстатии должна совпадать с той зоной что установлена в админке чтобы не было никаких проблем.
Записан
Septdir
Живу я здесь
******

Репутация: +35/-3
Offline Offline

Пол: Мужской
Сообщений: 838


Skype: septdir


« Ответ #13 : 29.11.2016, 16:23:16 »

Можно также использовать функцию MySQL UTC_TIMESTAMP(), если при этом на сервере установлена правильная временная зона. Она кстатии должна совпадать с той зоной что установлена в админке чтобы не было никаких проблем.
Каждый пользователь в профиле может выставить свою временную отличную от по умолчанию в админке, серверной и даже от зоны выставленной в его ОС, это тоже надо учитывать.

Какой вариант в итоге наиболее верный спорить не буду ибо даты лично для меня всегда были гемором, но почитать дискуссию на тему как же все таки верно, что все учесть с удовольствием почитаю
« Последнее редактирование: 29.11.2016, 16:30:10 от Septdir » Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7774



« Ответ #14 : 29.11.2016, 17:47:52 »

Каждый пользователь в профиле может выставить свою временную отличную от по умолчанию в админке, серверной и даже от зоны выставленной в его ОС, это тоже надо учитывать.
этого никак не учесть Azn если юзеру охота жить в -8 при том что реально он живет в +3 и время у него на компьютере +3 - то это его личное дело Azn

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

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

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

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

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

главное как уже сказали хранить в UTC, а не во времени юзера, и ни в каком другом чем попало. а если кого то угораздило на сервере иметь не
совпадать с той зоной что установлена в админке
то это тоже уже проблемы не Joomla, теперь это гемор админа, как он будет сохранять в UTC Azn
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #15 : 29.11.2016, 20:14:11 »

Тип поля timstamp всегда хранит время в UTC и гораздо больше подходит для хранения кратковременных дат. Если время на сервере устновлено правильно и правильно настроена временная зона в php то никаких дополнительно функций не требуется. Я честно незнаю почему разработчики Joomla использует datetime для хранения времени создания и обновления в таблицах и все эти функции преобразования
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #16 : 30.11.2016, 19:07:02 »

Кстатии, если все же будете пользоваться встроенными функциями Joomla для хранения времени в utc то имейте ввиду:

Код
$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, 19:19:57 от zomby6888 » Записан
b2z
Support Team
*****

Репутация: +710/-0
Offline Offline

Пол: Мужской
Сообщений: 7537


Разраблю понемногу


« Ответ #17 : 30.11.2016, 19:19:54 »

Ну не знаю, по мне так datetime удобнее. Ну тут как говорится, на вкус и цвет...

Datetime или timestamp
Should I use field 'datetime' or 'timestamp'?
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #18 : 30.11.2016, 19:26:47 »

Datetime больше подходит для хранения дат или исторический событий типа дней рождения и так далее, где временные зоны не важны. Timestamp помимо того что учитывает временные зоны, имеет еще некоторые встроенные функции для автоматического обновления текущей даты и больше подходит для хранения кратковременных дат: логи, даты создания/обновления. У каждого типа данных своя область применения, поэтому они и сосуществуют вместе, ИМХО.  
« Последнее редактирование: 30.11.2016, 19:31:23 от zomby6888 » Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet