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
Форумы портала PHP.SU :: Версия для печати :: выбор данных mysql и их сравнение
Форумы портала PHP.SU » » Работа с СУБД » выбор данных mysql и их сравнение

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

1. Dmitrey - 11 Января, 2013 - 16:03:17 - перейти к сообщению
есть таблица с фио(отдельный столбец) и датой(отдельный столбец) в MySQL. Необходимо проверить соответствие каждой даты из базы сегодняшнему дню(NOW) и двум дням раньше. Если дата из базы равна сегодняшнему дню,или соответствует любому из дней раньше сегодняшнего, вывести всю строку с ФИО и датой. При выборе из базы произвожу форматирование даты
$v = mysql_query("SELECT fam, FName, SName, bdate, DATE_FORMAT(bdate, '%d.%m.%Y') as 'bddate' FROM births");
while ( $row=mysql_fetch_assoc($v)){}.
Но вот каким образом сформулировать это сравнение не догоняю.Хотел в запросе к базе сделать,чтобы выбирались даты только с сегодняшним месяц,потом сравнивать только дни,но не понимаю как это реализовать. Потом хотел оформить запрос к базе с вывод в отдельные переменные дня и месяца,затем сравнивать в php сначало месяц,потом день и при совпадении выводить строчку.Но опять упёрся в недостаток опыта и знаний.
Помогите,пожалуйста.Третий день читаю форумы и мануалы,но не выходит каменный цветочек.
2. Мелкий - 11 Января, 2013 - 17:30:58 - перейти к сообщению
в запросе
CODE (SQL):
скопировать код в буфер обмена
  1. WHERE `bdate`>=CURRENT_DATE - interval 2 day
3. Dmitrey - 11 Января, 2013 - 19:59:19 - перейти к сообщению
а данная конструкция будет выводить записи, если они раньше первого числа месяца,т.е. выведет ли она 29 и 30 января если сегодня 1 февраля?Возможно глупый вопрос,но знать важно.
4. Мелкий - 11 Января, 2013 - 20:57:41 - перейти к сообщению
Mysql замечательно знаком с григорианским календарём.
Если специально мешать не будете - то интервал 2 дня - это интервал 2 дня и будет.
5. Dmitrey - 14 Января, 2013 - 07:04:01 - перейти к сообщению
Мелкий Супермодератор,
объясните,пожалуста, интервал берётся от сегодняшнего числа (14.01.2013). Но записи в таблицах имеют другой год (1989 например).Такой аспект влияет на выборку данных? Или он выбирает сначало по дням, потом по месяцам, потом по годам?
Извините,если спрашиваю глупость.
6. Мелкий - 14 Января, 2013 - 09:19:20 - перейти к сообщению
CURRENT_DATE - это текущая дата в формате год-месяц-день
interval 2 day - 2 календарных дня.
Сравнение дат идёт по порядку: год->месяц->день->час->минута->секунда

Задачу "этот день в прошлом" можно решить таким образом:
CODE (SQL):
скопировать код в буфер обмена
  1. WHERE date_format(`bdate`, '%m%d') BETWEEN date_format(CURRENT_DATE, '%m%d') AND date_format(CURRENT_DATE - interval 2 day, '%m%d')

Но получается довольно неоптимальный план выполнения, индексы такой запрос не использует. К тому же, использование CURRENT_DATE делает запрос некешируемым для кэша запросов. Если нужно выполнять часто и над довольно заметным массивом данных - нужно будет или добавлять фиктивное поле со значением месяц-день и искать по нему или кэшировать результат в приложении.
7. Dmitrey - 14 Января, 2013 - 10:05:06 - перейти к сообщению
Мелкий Супермодератор, сасибо большое!
Использовал фиктивное поле при выводе из таблицы и выбирал данные только по месяцу.

$v = mysql_query("SELECT fam, FName, SName, bdate, DATE_FORMAT(bdate, '%d.%m.%Y') as 'bddate',DATE_FORMAT(bdate, '%d') as 'bday' FROM births
WHERE MONTH(bdate) = MONTH(CURDATE())
/* WHERE DATE_FORMAT(bdate, '%m') = DATE_FORMAT(CURDATE(), '%m') */ - решил оставить на всякий случай
ORDER BY DATE_FORMAT(bdate, '%d')");

а дальше уже работаю с переменной $row['bday'] в while ( $row=mysql_fetch_assoc($v)) {

ещё раз огромное спасибо за разъяснения и подсказки.

 

Powered by ExBB FM 1.0 RC1