Добре время суток. Наткнулся на проблему которую не могу решить. Есть БД. В таблице поля date_start, date_end тип DATE, time_start, time_end тип TIME; В эту базу данных заносится дата врямя начала смены работы (date_start, time_start), и врямя конца смены работы (date_end, time_end). Смена может начаться в 23:00 и закончится в 8:00 следующего дня. Задача следующая: вывести статистику работы за неделю. сделал запрос: PHP: $res = mysql_query("SELECT * FROM `stats` WHERE `date_start` >= '".date_convert_to($date_from)."' AND `date_end` <= '".date_convert_to($date_to)."' ORDER BY `date_start`,`date_end` "); но столкнулся с проблемой следующего характера: 29ого числа в 23:00 начинается смена другой недели. А в интервал попадает 29ое число смена с 8:00 до 16:00 и 17:00 до 22:00. Как сделать так чтобы это исключить? Как-то надо сделать следующее: С первой записи выборки и последней сделать фильтр по времени. Пытался реализовать, но фильтр действует на каждую запись в отдельности. PHP: $time_start = 23:00:00; $res = mysql_query("SELECT * FROM `stats` WHERE `date_start` >= '".date_convert_to($date_from)."' AND `date_end` <= '".date_convert_to($date_to)."' AND `time_start` >='".$time_start."' ORDER BY `date_start`,`date_end` "); Моя идея может не работать, готов выслушать любые советы. Вплоть на то в какую сторону копать. Заранее спасибо
Может быть, неправильно понял, что вам надо, но почему бы не просто так? Если я правильно вас понял, то принадлежность одной строки к какой-то рабочей неделе завязана только на начале рабочего дня. То есть date_end вам в выборке не нужен, или нет? Код (Text): mysql> SELECT * -> FROM stats -> ORDER BY date_start ASC; +---------------------+---------------------+ | date_start | date_end | +---------------------+---------------------+ | 2010-05-25 23:00:00 | 2010-05-26 09:00:00 | | 2010-05-26 08:00:00 | 2010-05-26 16:00:00 | | 2010-05-26 13:00:00 | 2010-05-26 23:30:00 | | 2010-05-26 23:00:00 | 2010-05-27 09:00:00 | | 2010-05-27 08:00:00 | 2010-05-27 16:00:00 | | 2010-05-27 13:00:00 | 2010-05-27 23:30:00 | | 2010-05-27 23:00:00 | 2010-05-28 09:00:00 | | 2010-05-28 08:00:00 | 2010-05-28 16:00:00 | | 2010-05-28 13:00:00 | 2010-05-28 23:30:00 | | 2010-05-28 23:00:00 | 2010-05-29 09:00:00 | | 2010-05-29 08:00:00 | 2010-05-29 16:00:00 | | 2010-05-29 18:00:00 | 2010-05-30 08:00:00 | | 2010-05-29 23:00:00 | 2010-05-30 09:00:00 | | 2010-05-30 08:00:00 | 2010-05-30 16:00:00 | +---------------------+---------------------+ 14 rows in set (0.00 sec) mysql> SET @this_week_start = '2010-05-26 23:00:00'; Query OK, 0 rows affected (0.00 sec) mysql> SET @next_week_start = '2010-05-29 23:00:00'; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * -> FROM stats -> WHERE date_start >= @this_week_start -> AND date_start < @next_week_start -> ORDER by date_start ASC; +---------------------+---------------------+ | date_start | date_end | +---------------------+---------------------+ | 2010-05-26 23:00:00 | 2010-05-27 09:00:00 | | 2010-05-27 08:00:00 | 2010-05-27 16:00:00 | | 2010-05-27 13:00:00 | 2010-05-27 23:30:00 | | 2010-05-27 23:00:00 | 2010-05-28 09:00:00 | | 2010-05-28 08:00:00 | 2010-05-28 16:00:00 | | 2010-05-28 13:00:00 | 2010-05-28 23:30:00 | | 2010-05-28 23:00:00 | 2010-05-29 09:00:00 | | 2010-05-29 08:00:00 | 2010-05-29 16:00:00 | | 2010-05-29 18:00:00 | 2010-05-30 08:00:00 | +---------------------+---------------------+ 9 rows in set (0.00 sec)
Всё верно, но новая неделя начинается, в приведённом в моём примере, с 29 ого числа в 23:00. А в выборку следующей недели (с 2010-05-29 по 2010-06-05) попадает смена 29 ого числа с 8:00 до 16:00 и с 13:00 до 20:30. необходимо сделать запрос в котором бы следующая неделя начиналась с 2010-05-29 23:00:00. А вот как это сделать я ума не приложу. Вчера ночью пришла идея сделать несколько запросов и совместить их, но пока не реализовал =(
Ну. И? Не понимаю, в чём проблема. Это только вопрос правильного определения начала той недели, которая интересует и той после неё. Код (Text): mysql> SELECT * -> FROM stats -> ORDER BY date_start ASC; +---------------------+---------------------+ | date_start | date_end | +---------------------+---------------------+ | 2010-05-25 23:00:00 | 2010-05-26 09:00:00 | | 2010-05-26 08:00:00 | 2010-05-26 16:00:00 | | 2010-05-26 13:00:00 | 2010-05-26 23:30:00 | | 2010-05-26 23:00:00 | 2010-05-27 09:00:00 | | 2010-05-27 08:00:00 | 2010-05-27 16:00:00 | | 2010-05-27 13:00:00 | 2010-05-27 23:30:00 | | 2010-05-27 23:00:00 | 2010-05-28 09:00:00 | | 2010-05-28 08:00:00 | 2010-05-28 16:00:00 | | 2010-05-28 13:00:00 | 2010-05-28 23:30:00 | | 2010-05-28 23:00:00 | 2010-05-29 09:00:00 | | 2010-05-29 08:00:00 | 2010-05-29 16:00:00 | | 2010-05-29 18:00:00 | 2010-05-30 08:00:00 | | 2010-05-29 23:00:00 | 2010-05-30 09:00:00 | | 2010-05-30 08:00:00 | 2010-05-30 16:00:00 | +---------------------+---------------------+ 14 rows in set (0.00 sec) mysql> SET @this_week_start = '2010-05-29 23:00:00'; Query OK, 0 rows affected (0.00 sec) mysql> SET @next_week_start = '2010-06-05 23:00:00'; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * -> FROM stats -> WHERE date_start >= @this_week_start -> AND date_start < @next_week_start -> ORDER BY date_start ASC; +---------------------+---------------------+ | date_start | date_end | +---------------------+---------------------+ | 2010-05-29 23:00:00 | 2010-05-30 09:00:00 | | 2010-05-30 08:00:00 | 2010-05-30 16:00:00 | +---------------------+---------------------+ 2 rows in set (0.06 sec)
я идею понял, но время начала смены и конца у меня храниться в разных ячейках. Поэтому наверное и не работает как у тебя. time_start, time_end. структура таблицы: просто я потом для наглядности их совмещаю: PHP: '<td nowrap>'.$row['date_start'].' '.$row['time_start'].'</td>'. '<td nowrap>'.$row['date_end'].' '.$row['time_end'].'</td>'. все записи: если пишу запрос сортировкой для времени, то от выкидывает все остальные смены которые начались не 23:00:00. PHP: $date_start = '2010-05-29'; $date_end = '2010-06-05'; $time_star = '23:00:00'; $res = mysql_query("SELECT * FROM `stats` WHERE `date_start` >= '".$date_start."' AND `date_start` < '".date_end."' AND `time_start` >= '".$time_start."' ORDER BY `date_start`,`date_end` Так не хочется структуру переделывать. Попробую с интервалами разобраться. Есть еще одна идея: сделать выборку по одной дате (начала недели), с критерием смены (23:00:00). потом, выборку до конца недели не включая последний день, и затем выборку последнего дня где смена заканчивается в 23:00.
нашел решение [sql] SELECT * FROM `stats` WHERE concat_ws(" ",`date_start`, `time_start`) >= "2010-05-29 23:00:00" [/sql]