Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Поиск во временном диапозоне

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Elegant
Отправлено: 15 Ноября, 2015 - 11:37:56
Post Id



Частый гость


Покинул форум
Сообщений всего: 151
Дата рег-ции: Май 2012  


Помог: 1 раз(а)




Привет всем! Подскажите такой вопрос
Есть скрипт который ищет по базе данных все работающие в данный момент заведения...
Вот пример кода
PHP:
скопировать код в буфер обмена
  1. $now=date("G:i:s");
  2. $sql = "SELECT * FROM  `mesta` WHERE  `timestart` <='$now' AND `timeend`>='$now'";
  3.  


А вот база
ID | timestart | timeend
1 | 12:00 | 23:00
2 | 09:00 | 22:00
3 | 12:00 | 01:00

т.е. если сейчас 15:00, то выведем 1 и 2
НО заведение 3 работает с 12:00 до 1 часа ночи
И условие не выполняется.. КАк сделать правильно что бы выдал все 3 значения в временном диапозоне?
 
 Top
OrmaJever Модератор
Отправлено: 15 Ноября, 2015 - 12:20:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Elegant пишет:
КАк сделать правильно что бы выдал все 3 значения в временном диапозоне?

третье значени НЕ во временном диапазоне! Если же вы хотите получить все 3 значения то просто уберите WHERE из запроса


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
tuareg
Отправлено: 15 Ноября, 2015 - 13:39:28
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Все достаточно просто, но придется поменять тип столбика на datetime. И при сохранении проверять если время начала работы > окончания, то сохранять как 0000-00-01 01:00:00
Т.е у Вас получится следующий вид

ID | timestart | timeend
1 | 0000-00-00 12:00 | 0000-00-00 23:00
2 | 0000-00-00 09:00 | 0000-00-00 22:00
3 | 0000-00-00 12:00 | 0000-00-01 01:00
А в запрос будет подставлять
$now='0000-00-00 '.date("G:i:s");
$sql = "SELECT * FROM `mesta` WHERE `timestart` <='$now' AND `timeend`>='$now'";
По идее все должно работать
 
 Top
SAD
Отправлено: 15 Ноября, 2015 - 13:43:00
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009  
Откуда: Днепропетровск, Украина


Помог: 75 раз(а)




еще вариант, но не мой.

WHERE timestart < timeend AND $now BETWEEN timestart and timeend
OR (timestart > timeend AND ($now > timestart OR $now < timeend))

при этом варианте не нужно менять тип поля, но тут не подхватятся индексы по полю.

вариант выше - интереснее.

(Отредактировано автором: 15 Ноября, 2015 - 13:43:51)

 
 Top
Elegant
Отправлено: 16 Ноября, 2015 - 05:45:35
Post Id



Частый гость


Покинул форум
Сообщений всего: 151
Дата рег-ции: Май 2012  


Помог: 1 раз(а)




tuareg пишет:
Все достаточно просто, но придется поменять тип столбика на datetime. И при сохранении проверять если время начала работы > окончания, то сохранять как 0000-00-01 01:00:00
Т.е у Вас получится следующий вид

ID | timestart | timeend
1 | 0000-00-00 12:00 | 0000-00-00 23:00
2 | 0000-00-00 09:00 | 0000-00-00 22:00
3 | 0000-00-00 12:00 | 0000-00-01 01:00
А в запрос будет подставлять
$now='0000-00-00 '.date("G:i:s");
$sql = "SELECT * FROM `mesta` WHERE `timestart` <='$now' AND `timeend`>='$now'";
По идее все должно работать


Сделал по вашей инструкции по логике правильно только одно НО
если время больше 24.00 т.е. к пример 00,30 то переменная NOW выглядит как
$now='0000-00-00 00:30:00';
А чтобы данное условие выполнилось правильно перменная должна приобрести вид
$now='0000-00-01 00:30:00';
Как это осуществить?
 
 Top
tuareg
Отправлено: 16 Ноября, 2015 - 07:45:07
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Это хороший вопрос. Подумаю. Отпишу вечером.
 
 Top
Sail
Отправлено: 16 Ноября, 2015 - 08:21:30
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




Elegant, tuareg, напомню о существовании типа time

(Отредактировано автором: 16 Ноября, 2015 - 08:21:50)

 
 Top
Мелкий Супермодератор
Отправлено: 16 Ноября, 2015 - 09:56:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Есть экспериментальная мысль:
вынести время открытия-закрытия в отдельную таблицу: id заведения, время открытия, время закрытия. Для postgresql - id заведения + range с индексом
Писать как-то так:
1 | 12:00 | 23:00
2 | 09:00 | 22:00
3 | 12:00 | 23:59
3 | 00:00 | 01:00

Получаем простое чтение, и, как бонус, возможность корректно обрабатывать перерывы в работе.


-----
PostgreSQL DBA
 
 Top
Panoptik
Отправлено: 16 Ноября, 2015 - 10:10:23
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




то есть насколько я понял мысль Мелкого, возможно слегка измененная.
есть таблица тайм ренжов. в ней описаны все возможные ренжи до той детализации которая нам нужна. к примеру до получаса
00:00 00:30
00:30 01:00
01:00 01:30
.....
23:30 00:00

когда мы сохраняем или обновляем время работы заведения мы сохраняем в таблице много-ко-многим все ключи ренжев которые нам подходят.
и после делаем поиск просто по таблице ренжев и смотрим есть ли найденный индекс у этого заведения
единственный момент надо продумать про граничные значения. где использовать 00:59 итд, потому что если я захочу посмотреть кто работает в 01:00 то у меня вроде как будет срабатывать условие от 01:00 до 01:30 хотя возможно заведение закрывается в час

короче подумав делаю вывод что все таки нужно хранить второе время как на минуту меньшее
00:00 00:29
00:30 00:59
01:00 01:29
.......
23:30 23:59

заморочка приличная, но если вариант со сложным WHERE не подходит, то в помощь придут 2 joina и односложный where Улыбка

(Отредактировано автором: 16 Ноября, 2015 - 10:11:39)



-----
Just do it
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB