Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте,
Есть таблица с заказами, которые постоянно поступают. В принципе для сути дела не важно, откуда они. Их надо отобразить посуточно, причём не с полуночи до полуночи, а с 3 часов ночи предыдущего дня до 3 часов ночи следующего дня. Т.е. к примеру:
Дата 1 марта: видно заказы, поступившие в период с 1 марта 3 часов ночи до 2 марта 3 часов ночи.
Дата 2 марта: видно заказы, поступившие в период с 2 марта 3 часов ночи до 3 марта 3 часов ночи.
Причём, если наступило 2 марта, но время, к примеру, 1.40, то должны быть видны заказы поступившие в период с 1 марта 3 часов ночи до 2 марта 3 часов ночи. Т.е. сутки как бы "сдвигаются" на 3 часа вперёд. Все указанные даты должны быть локальными (те, которые возвращают NOW(), CURRENT_DATE(), CURRENT_TIME()).
Какие здесь могут быть варианты запросов к базе? Дата поступления заказа хранится в поле с типом DATETIME.
Всем спасибо за помощь!
Сразу говорю: следующий запрос:
select * from orders where
date_open > DATE_ADD(current_date(), INTERVAL -21 HOUR)
and date_open < DATE_ADD(current_date(), INTERVAL 3 HOUR);
НЕ РАБОТАЕТ!
Неактивен
Вот такие выражения работают
mysql> select current_date() + INTERVAL 3 HOUR;
+----------------------------------+
| current_date() + INTERVAL 3 HOUR |
+----------------------------------+
| 2008-03-18 03:00:00 |
+----------------------------------+
1 row in set (0.00 sec)
mysql> select current_date() - INTERVAL 21 HOUR;
+-----------------------------------+
| current_date() - INTERVAL 21 HOUR |
+-----------------------------------+
| 2008-03-17 03:00:00 |
+-----------------------------------+
1 row in set (0.00 sec)
Неактивен
Да я-то понимаю!
А запрос тогда почему не работает???
Просто мне нужно чтобы эти 2 выражения одновременно сработали
Отредактированно mark1983 (18.03.2008 23:31:57)
Неактивен
Должен работать Ваш запрос. В каком формате open_date? Какой тип? Если date, то open_date не содержит времени и Вам следует добавить к нему 0 часов, чтобы преобразовать в дату-время
select * from orders where
date_open + INTERVAL 0 HOUR > DATE_ADD(current_date(), INTERVAL -21 HOUR)
and date_open + INTERVAL 0 HOUR < DATE_ADD(current_date(), INTERVAL 3 HOUR);
Неактивен
Дата в формате 0000-00-00 00:00:00
Есть там время и запросы по отдельности работают ((
Неактивен
Работают по отдельности и дают пересекающиеся выборки? А что значит запрос "не работает"?
Неактивен
Блин!... кажется работает!!! После долгих мучений!...
Пока не закрывайте тему. Подожду до завтрашнего утра. Если будет так как я думаю, тогда замечательно!
Неактивен
Не-а, не работает.
В таблице заказов есть заказ, датированный 19.3.2008 10:00. По идее он должен отображаться, а его почему-то нет...
Отредактированно mark1983 (19.03.2008 08:41:49)
Неактивен
mark1983 написал:
Не-а, не работает.
В таблице заказов есть заказ, датированный 19.3.2008 10:00. По идее он должен отображаться, а его почему-то нет...
Он и не должен отображаться. Ваше условие "date_open > DATE_ADD(current_date(), INTERVAL -21 HOUR) and date_open < DATE_ADD(current_date(), INTERVAL 3 HOUR);" выводит данные с 3ех утра вчерашенего дня (т.е. 18.03) по 3 утра сегодняшнего дня (т.е. 19.03).
А 19.3.2008 10:00 это больше чем DATE_ADD(current_date(), INTERVAL 3 HOUR) = 19.3.2008 03:00.
Неактивен
Мне нужно чтобы заказы менялись КАЖДЫЙ день в 3 часа ночи.
Т.е. 19 марта в 3.01 УЖЕ должен отображаться заказ сделанный на 19 марта 10 утра.
Т.е. 19 марта в 3.01 уже должны отображаться заказы, сделанные с 19.03 03:00 по 20.03 03:00.
Отредактированно mark1983 (19.03.2008 19:08:47)
Неактивен
Тогда условие должно быть другое
select * from orders where
(col_stamp - interval 3 hour) > current_date()
and
(col_stamp - interval 3 hour) < date_add(current_date(), interval 24 hour);
Неактивен