Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с датами - дни рождения. 
V
    Опции темы
Archil
  Дата 20.2.2014, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.2.2014

Репутация: нет
Всего: нет



Доброго времени суток, столкнулся с такой задачей, есть база данных, где собраны даты рождения в формате ГГГГ-ММ-ДД.
Нужно выбрать пользователей у которых будет день рождения в в заданном промежутке времени например:
У кого будет день рождение в периоде от 12 августа до 25 сентября.
Заранее спасибо.
PM MAIL   Вверх
baldina
Дата 20.2.2014, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



проблема в чем?
PM MAIL   Вверх
Archil
Дата 20.2.2014, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.2.2014

Репутация: нет
Всего: нет



Цитата(baldina @ 20.2.2014,  01:51)
проблема в чем?

Просто не мог сформулировать запрос, пока я с MySQL на "Вы".
Потом докапался.
Код

select * from `таблица` where (month(`имя поля`) = 8 and day(`имя поля`) > 11) or (month(`имя поля`) = 9 and day(`имя поля`) < 26);

PM MAIL   Вверх
baldina
Дата 20.2.2014, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



не очень хороший запрос, т.к. слишком частный: если понадобится диапазон не между соседними месяцами, такая схема не будет работать
в sql есть оператор between: 
Код

select * from table where date_field between start_date and end_date

PM MAIL   Вверх
Archil
Дата 20.2.2014, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.2.2014

Репутация: нет
Всего: нет



Да вы правы, да и еще мой запрос будет работать только на период месяца, но запрос который показываете Вы имеет один нюянс, к примеру даты рождения пользователей в полном формате будет ли он находить дни рождения от скажем мая этого года до ноября?
PM MAIL   Вверх
Агрох
Дата 20.2.2014, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: 1
Всего: 6



Код

select * from `таблица` where (month(`имя поля`) = month(start_date) AND day(`имя поля`) >= day(start_date)) 
OR (month(`имя поля`) = month(end_date) AND day(`имя поля`) <= day(end_date)) 
OR (month(`имя поля`) > month(start_date) AND month(`имя поля`) < month(end_date));


Добавлено @ 11:15
Нет, даже так:

Код

select * from `таблица` where  (month(start_date) <> month(end_date) AND ((month(`имя поля`) = month(start_date) AND day(`имя поля`) >= day(start_date)) 
OR (month(`имя поля`) = month(end_date) AND day(`имя поля`) <= day(end_date))))
OR ((month(`имя поля`) = month(start_date) AND day(`имя поля`) >= day(start_date)) AND (month(`имя поля`) = month(end_date) AND day(`имя поля`) <= day(end_date))) 
OR (month(`имя поля`) > month(start_date) AND month(`имя поля`) < month(end_date));


Это при условии, что start_date и end_date это даты, но значимыми там являются только месяц и день.

Это сообщение отредактировал(а) Агрох - 20.2.2014, 11:16
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
baldina
Дата 20.2.2014, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



Агрох, кашмар

Archil 
Код

x between a and b
эквивалентно
Код

a <= x and x <= b

почему бы ему не находить от мая до ноября?
Код

select * from table where date_field between '20140501' and '20141130'

и с ноября по май
Код

select * from table where date_field between '20141130' and '20150501'


Добавлено через 13 минут и 55 секунд
тип даты тут, кстати, необязателен. учитывая, что год может быть не важен, а год рождения явно остался позади,
пойдет
Код

set @month_start=5;
set @day_start=1;
set @month_end=11;
set @day_end=30;
set @start=@month_start*100+@day_start;
set @end=@month_end*100+@day_end;
select * from table where month(birthday)*100+day(birthday) between @start and @end;

PM MAIL   Вверх
Агрох
Дата 20.2.2014, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: 1
Всего: 6



Цитата(baldina @  20.2.2014,  14:07 Найти цитируемый пост)
почему бы ему не находить от мая до ноября?

Код

select * from table where date_field between '20140501' and '20141130'


и с ноября по май

Код

select * from table where date_field between '20141130' and '20150501'


Потому что человек родился в 2001 году. Есть дата рождения, а не дата, когда в этом году у него будет день рождения. В этих примерах ты найдёшь только даты рождения людей, которые родились в 2014 и 2015 годах. Поэтому такой вариант точно не прокатит.
Мой вариант громоздок и не оптимален, но он работает.

Цитата(baldina @  20.2.2014,  14:07 Найти цитируемый пост)
Код

set @month_start=5;
set @day_start=1;
set @month_end=11;
set @day_end=30;
set @start=@month_start*100+@day_start;
set @end=@month_end*100+@day_end;
select * from table where month(birthday)*100+day(birthday) between @start and @end;


А вот это уже что то. Возьму на заметку.

Это сообщение отредактировал(а) Агрох - 20.2.2014, 15:38
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Archil
Дата 20.2.2014, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.2.2014

Репутация: нет
Всего: нет



Код

set @month_start=5;
set @day_start=1;
set @month_end=11;
set @day_end=30;
set @start=@month_start*100+@day_start;
set @end=@month_end*100+@day_end;
select * from table where month(birthday)*100+day(birthday) between @start and @end;

Да это мне помогло, просто потом надо  будет вернуть  всё назат, спасибо  большое!
PM MAIL   Вверх
baldina
Дата 21.2.2014, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



Цитата

если конечная дата уходит в другой год как можно  поступить?

в случае, если год конечной даты больше, то использовать отрицание
Код

not (a <= x and x <= b)



Это сообщение отредактировал(а) baldina - 21.2.2014, 14:21
PM MAIL   Вверх
Archil
Дата 21.2.2014, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.2.2014

Репутация: нет
Всего: нет



Появилась новая проблема, при переходе в другой год, возможно ли решить  её? Имеется в виду, что  если  конечная дата уйдёт в 2015 год.

Это сообщение отредактировал(а) Archil - 21.2.2014, 15:42
PM MAIL   Вверх
baldina
Дата 21.2.2014, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



см. на один пост выше
PM MAIL   Вверх
Archil
Дата 21.2.2014, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.2.2014

Репутация: нет
Всего: нет



Спасибо  а можно  на примере?
PM MAIL   Вверх
baldina
Дата 21.2.2014, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



что-то типа
Код

where 
(
 year(start_date)=year(end_date) 
 and 
 (
    month(birthday)*100+day(birthday) between 
      month(start_date)*100+day(start_date)
      and
      month(end_date)*100+day(end_date)
  )
)
or
(
  year(start_date)+1=year(end_date) 
  and 
  not (
    month(birthday)*100+day(birthday) between 
      month(start_date)*100+day(start_date)
      and
      month(end_date)*100+day(end_date)
  )
)




Это сообщение отредактировал(а) baldina - 21.2.2014, 19:30
PM MAIL   Вверх
Archil
Дата 21.2.2014, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 20.2.2014

Репутация: нет
Всего: нет



Спасибо  сейчас буду пробовать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1054 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.