|
|
|
| Здравствуйте форумчане.
Возник такой вопрос.
Есть таблица, в которой два поля: ФИО и дата рождения, скажем 1980-08-28(тип поля DATE)
Как мне выбрать ФИО у которых сегодня день рождения, т.е. 08-28, а также на неделю вперед. | |
|
|
|
|
|
|
|
для: dert
(28.08.2008 в 13:36)
| | ну если тип данных поля такой 1980-08-28 то примерно так:
select * from table where birth_date between currentdate and adddate(current_date,7)
где birth_date поле с датой рождения | |
|
|
|
|
|
|
|
для: ronin80
(28.08.2008 в 13:48)
| | таким макаром, конечно, можно выбрать... но лишь новорожденных (если б их записи были в таблице - что маловероятно) | |
|
|
|
|
|
|
|
для: Trianon
(28.08.2008 в 13:57)
| | блин точно, тупанул :) | |
|
|
|
|
|
|
|
для: 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))
наверное так | |
|
|
|
|
|
|
|
для: ronin80
(28.08.2008 в 14:18)
| | нет. сегодня в эту выборку должен попасть сентябрь.
between 28 and 4 - не пойдет. | |
|
|
|
|
|
|
|
для: Trianon
(28.08.2008 в 14:38)
| | да, тут всё сложнее чем я думал :) | |
|
|
|
|
|
|
|
для: 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...
|
а дальше с интервалом не тяну :(
не томите :) | |
|
|
|
|
|
|
|
для: 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');
|
| |
|
|
|
|
|
|
|
для: Root
(28.08.2008 в 19:11)
| | Кольцо не замкнуто в конце года. | |
|
|
|
|
|
|
|
для: 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());
|
| |
|
|
|
|
|
|
|
для: Root
(28.08.2008 в 19:27)
| | year(bday) <= year(now() однозначно. Лет так на дцать. Или опять новорожденных ищем? :) | |
|
|
|
|
|
|
|
для: Trianon
(28.08.2008 в 19:31)
| | аааааааа..
да что ж такое.. :-) | |
|
|
|
|
|
|
|
для: 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);
|
| |
|
|
|
|
|
|
|
для: 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 февраля ушла куда-то сама собой... | |
|
|
|
|
|
|
|
для: 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());
|
? | |
|
|
|
|
|
|
|
для: Root
(28.08.2008 в 22:42)
| | Представьте себе, что bday = 1990-01-02 и сегодня 2008-12-29 | |
|
|
|
|
|
|
|
для: Trianon
(28.08.2008 в 23:57)
| | хм..
'бага' какая-то :-) | |
|
|
|
|
|
|
|
для: Trianon
(28.08.2008 в 23:57)
| | А я не понял :)
Объясните пожалуйста
Ну и попадут в выборку эти 5 дней...(1 вариант Root)
При чём тут года? | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: 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');
|
интересная хрень получается... :)
Спасибо ! | |
|
|
|
|
|
|
|
для: Trianon
(28.08.2008 в 23:57)
| | . | |
|
|
|
|
|
|
|
для: Trianon
(28.08.2008 в 20:08)
| | Trianon, большое спасибо! | |
|
|
|
|
|
|
|
для: Root
(28.08.2008 в 19:11)
| | . | |
|
|
|