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 :: выбор данных mysql и их сравнение

 PHP.SU

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


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

> Описание: есть столбец с датой, надо сравнить с настоящей и выбрать подходящую
Dmitrey
Отправлено: 11 Января, 2013 - 16:03:17
Post Id


Новичок


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


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




есть таблица с фио(отдельный столбец) и датой(отдельный столбец) в 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 сначало месяц,потом день и при совпадении выводить строчку.Но опять упёрся в недостаток опыта и знаний.
Помогите,пожалуйста.Третий день читаю форумы и мануалы,но не выходит каменный цветочек.
 
 Top
Мелкий Супермодератор
Отправлено: 11 Января, 2013 - 17:30:58
Post Id



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


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


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




в запросе
CODE (SQL):
скопировать код в буфер обмена
  1. WHERE `bdate`>=CURRENT_DATE - interval 2 day


-----
PostgreSQL DBA
 
 Top
Dmitrey
Отправлено: 11 Января, 2013 - 19:59:19
Post Id


Новичок


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


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




а данная конструкция будет выводить записи, если они раньше первого числа месяца,т.е. выведет ли она 29 и 30 января если сегодня 1 февраля?Возможно глупый вопрос,но знать важно.
 
 Top
Мелкий Супермодератор
Отправлено: 11 Января, 2013 - 20:57:41
Post Id



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


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


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




Mysql замечательно знаком с григорианским календарём.
Если специально мешать не будете - то интервал 2 дня - это интервал 2 дня и будет.


-----
PostgreSQL DBA
 
 Top
Dmitrey
Отправлено: 14 Января, 2013 - 07:04:01
Post Id


Новичок


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


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




Мелкий Супермодератор,
объясните,пожалуста, интервал берётся от сегодняшнего числа (14.01.2013). Но записи в таблицах имеют другой год (1989 например).Такой аспект влияет на выборку данных? Или он выбирает сначало по дням, потом по месяцам, потом по годам?
Извините,если спрашиваю глупость.
 
 Top
Мелкий Супермодератор
Отправлено: 14 Января, 2013 - 09:19:20
Post Id



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


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


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




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 делает запрос некешируемым для кэша запросов. Если нужно выполнять часто и над довольно заметным массивом данных - нужно будет или добавлять фиктивное поле со значением месяц-день и искать по нему или кэшировать результат в приложении.


-----
PostgreSQL DBA
 
 Top
Dmitrey
Отправлено: 14 Января, 2013 - 10:05:06
Post Id


Новичок


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


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




Мелкий Супермодератор, сасибо большое!
Использовал фиктивное поле при выводе из таблицы и выбирал данные только по месяцу.

$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)) {

ещё раз огромное спасибо за разъяснения и подсказки.
 
 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