Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выбрать всех людей у которых сегодня день рождение
 
 автор: dert   (28.08.2008 в 13:36)   письмо автору
 
 

Здравствуйте форумчане.

Возник такой вопрос.
Есть таблица, в которой два поля: ФИО и дата рождения, скажем 1980-08-28(тип поля DATE)
Как мне выбрать ФИО у которых сегодня день рождения, т.е. 08-28, а также на неделю вперед.

  Ответить  
 
 автор: ronin80   (28.08.2008 в 13:48)   письмо автору
 
   для: dert   (28.08.2008 в 13:36)
 

ну если тип данных поля такой 1980-08-28 то примерно так:

select * from table where birth_date between currentdate and adddate(current_date,7)

где birth_date поле с датой рождения

  Ответить  
 
 автор: Trianon   (28.08.2008 в 13:57)   письмо автору
 
   для: ronin80   (28.08.2008 в 13:48)
 

таким макаром, конечно, можно выбрать... но лишь новорожденных (если б их записи были в таблице - что маловероятно)

  Ответить  
 
 автор: ronin80   (28.08.2008 в 14:15)   письмо автору
 
   для: Trianon   (28.08.2008 в 13:57)
 

блин точно, тупанул :)

  Ответить  
 
 автор: ronin80   (28.08.2008 в 14:18)   письмо автору
 
   для: ronin80   (28.08.2008 в 14:15)
 

select *
from table
where
(day(birth_date) between day(currentdate) and day(adddate(currentdate,7)))
and
(month(birth_date)=month(currentdate))

наверное так

  Ответить  
 
 автор: Trianon   (28.08.2008 в 14:38)   письмо автору
 
   для: ronin80   (28.08.2008 в 14:18)
 

нет. сегодня в эту выборку должен попасть сентябрь.

between 28 and 4 - не пойдет.

  Ответить  
 
 автор: ronin80   (28.08.2008 в 15:06)   письмо автору
 
   для: Trianon   (28.08.2008 в 14:38)
 

да, тут всё сложнее чем я думал :)

  Ответить  
 
 автор: mehelson   (28.08.2008 в 18:00)   письмо автору
 
   для: ronin80   (28.08.2008 в 15:06)
 

Мда, задачка...
SЕLЕСТ * FRОМ tаblе WHЕRЕ DАТЕ_FОRМАТ(`bdаtе`, '%m-%d')  >= DАТЕ_FОRМАТ(NОW(), '%m-%d') АND...

а дальше с интервалом не тяну :(
не томите :)

  Ответить  
 
 автор: Root   (28.08.2008 в 19:11)   письмо автору
 
   для: mehelson   (28.08.2008 в 18:00)
 

SELECT * FROM tbl_name WHERE
date_format(birthday, '%m%d') 
BETWEEN date_format(CURDATE(), '%m%d') 
AND date_format(ADDDATE(CURDATE() , INTERVAL 7 DAY), '%m%d');

  Ответить  
 
 автор: Trianon   (28.08.2008 в 19:24)   письмо автору
 
   для: Root   (28.08.2008 в 19:11)
 

Кольцо не замкнуто в конце года.

  Ответить  
 
 автор: Root   (28.08.2008 в 19:27)   письмо автору
 
   для: Trianon   (28.08.2008 в 19:24)
 

>Кольцо не замкнуто в конце года.
:-)
SELECT * FROM btl_name WHERE
date_format(bday, '%m%d') 
BETWEEN date_format(CURDATE(), '%m%d') 
AND date_format(ADDDATE(CURDATE() , INTERVAL 7 DAY), '%m%d')
AND year(bday) <= year(now());

  Ответить  
 
 автор: Trianon   (28.08.2008 в 19:31)   письмо автору
 
   для: Root   (28.08.2008 в 19:27)
 

year(bday) <= year(now() однозначно. Лет так на дцать. Или опять новорожденных ищем? :)

  Ответить  
 
 автор: Root   (28.08.2008 в 19:32)   письмо автору
 
   для: Trianon   (28.08.2008 в 19:31)
 

аааааааа..
да что ж такое.. :-)

  Ответить  
 
 автор: Root   (28.08.2008 в 19:50)   письмо автору
 
   для: Trianon   (28.08.2008 в 19:31)
 

я уже ничё не понимаю.. :-)
SELECT * FROM tbl_name WHERE
date_format(bday, '%m%d') 
BETWEEN date_format(CURDATE(), '%m%d') 
AND date_format(ADDDATE(CURDATE() , INTERVAL 7 DAY), '%m%d')
AND year(bday) <= year(now() - INTERVAL $userdefined YEAR);

  Ответить  
 
 автор: Trianon   (28.08.2008 в 20:08)   письмо автору
 
   для: Root   (28.08.2008 в 19:50)
 

SELECT * FROM tbl_name WHERE 
WHERE
  IF(date_format(CURDATE(), '%m%d') <= '1224' , 
       date_format(bday, '%m%d') 
            BETWEEN 
                 date_format(CURDATE(), '%m%d') 
               AND 
                 date_format(CURDATE()+INTERVAL 7 DAY, '%m%d'),
      NOT ( 
        date_format(bday, '%m%d') 
             BETWEEN 
                  date_format(CURDATE()+INTERVAL 8 DAY, '%m%d') 
               AND 
                  date_format(CURDATE()-INTERVAL 1 DAY, '%m%d')
       )
    )


и чему я больше всего удивлен - проблема 29 февраля ушла куда-то сама собой...

  Ответить  
 
 автор: Root   (28.08.2008 в 22:42)   письмо автору
 
   для: Trianon   (28.08.2008 в 20:08)
 

хм..
объясните чем ваш вариант лучше моего:
SELECT * FROM tbl_name WHERE
date_format(bday, '%m%d')
BETWEEN date_format(CURDATE(), '%m%d')
AND date_format(ADDDATE(CURDATE() , INTERVAL 7 DAY), '%m%d')
AND year(bday) <= year(now());

?

  Ответить  
 
 автор: Trianon   (28.08.2008 в 23:57)   письмо автору
 
   для: Root   (28.08.2008 в 22:42)
 

Представьте себе, что bday = 1990-01-02 и сегодня 2008-12-29

  Ответить  
 
 автор: Root   (29.08.2008 в 00:03)   письмо автору
 
   для: Trianon   (28.08.2008 в 23:57)
 

хм..
'бага' какая-то :-)

  Ответить  
 
 автор: Mehelson   (29.08.2008 в 03:30)   письмо автору
 
   для: Trianon   (28.08.2008 в 23:57)
 

А я не понял :)
Объясните пожалуйста
Ну и попадут в выборку эти 5 дней...(1 вариант Root)
При чём тут года?

  Ответить  
 
 автор: Trianon   (29.08.2008 в 08:01)   письмо автору
 
   для: Mehelson   (29.08.2008 в 03:30)
 

date_format(bday, '%m%d')
BETWEEN date_format(CURDATE(), '%m%d')
AND date_format(ADDDATE(CURDATE() , INTERVAL 7 DAY), '%m%d')
AND year(bday) <= year(now()) 
===
date_format('1990-01-02', '%m%d')
BETWEEN date_format('2008-12-29', '%m%d')
AND date_format(ADDDATE('2008-12-29' , INTERVAL 7 DAY), '%m%d')
AND year('1990-01-02') <= year('2008-12-29') 
===
'01-02' BETWEEN '12-29'
AND date_format('2009-01-05', '%m%d')
'1990' <= '2008' 
===
'01-02' BETWEEN '12-29' AND '01-05'
AND 1
===
0 AND 1
===
0

  Ответить  
 
 автор: mehelson   (29.08.2008 в 08:24)   письмо автору
 
   для: Trianon   (29.08.2008 в 08:01)
 

Спасибо большое ! доходчиво !
в этом случае с вашим вариантом -
Отображает строки 0 - 8 (9 всего, запрос занял 0.0006 сек.)

с другим -
MySQL вернула пустой результат (т.е. ноль строк). (запрос занял 0.0006 сек.)

данные :
INSERT INTO `test` (`id`, `bday`)
VALUES (1, '1990-01-02'),
(2, '2008-12-29'), 
(3, '2009-01-05'), 
(4, '2009-01-04'), 
(5, '2009-01-03'), 
(6, '2009-01-02'), 
(7, '2009-01-01'), 
(8, '2008-12-30'), 
(9, '1990-01-03');

интересная хрень получается... :)
Спасибо !

  Ответить  
 
 автор: Mehelson   (29.08.2008 в 03:30)   письмо автору
 
   для: Trianon   (28.08.2008 в 23:57)
 

.

  Ответить  
 
 автор: dert   (29.08.2008 в 10:46)   письмо автору
 
   для: Trianon   (28.08.2008 в 20:08)
 

Trianon, большое спасибо!

  Ответить  
 
 автор: mehelson   (28.08.2008 в 19:27)   письмо автору
 
   для: Root   (28.08.2008 в 19:11)
 

.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования