Вложеный запрос и сравнение даты

kolyazdv

Новичок
Вложеный запрос и сравнение даты

есть 2 таблицы:

PHP:
CREATE TABLE `test_user` (
`id` INT( 7 ) NOT NULL ,
`name` VARCHAR( 15 ) NOT NULL ,
`pass` VARCHAR( 15 ) NOT NULL ,
`data_birdth` DATE NOT NULL ,
PRIMARY KEY ( `id` ) , UNIQUE (`name` )
) ENGINE = MYISAM ;


CREATE TABLE `test_signs` (
`name` VARCHAR( 15 ) NOT NULL ,
`bdata` DATE NOT NULL ,
`edata` DATE NOT NULL ,
PRIMARY KEY ( `name` ) 
)
нужно с таблицы test_user по ID user'a вывести к какому периоду относться поле `test_user`.data_birdth из 2-й таблицы

при условии что год не должен влиять на дату.... т. е. 1983-05-25 = 20005-05-25

получился такой запрос... но почему-то он не правильно работает... скажите в чем проблемма
PHP:
SELECT * 
FROM `test_signs` 
WHERE DATE_FORMAT( (

SELECT `test_user`.`data_birdth` 
FROM `test_user` 
WHERE `test_user`.`id` =1
), '%d.%m' ) >= DATE_FORMAT( test_signs.bdata, '%d.%m' ) 
AND DATE_FORMAT( (

SELECT `test_user`.`data_birdth` 
FROM `test_user` 
WHERE `test_user`.`id` =1
), '%d.%m' ) <= DATE_FORMAT( test_signs.edata, '%d.%m' )
 

findnext

Новичок
kolyazdv
http://sqlzoo.net/

тут можно много полезного найти

+ смотри в сторону BETWEEN
 

kolyazdv

Новичок
SELECT *
FROM `test_signs`
WHERE DATE_FORMAT( (

SELECT `test_user`.`data_birdth`
FROM `test_user`
WHERE `test_user`.`id` =1
), '%d.%m' )
BETWEEN DATE_FORMAT( test_signs.bdata, '%d.%m' )
AND DATE_FORMAT( test_signs.edata, '%d.%m' )

получилося что-то типа такого но всеравно не работает... (
 

findnext

Новичок
.

-~{}~ 11.03.09 18:47:

kolyazdv
объясни ещё разок...чего то какой то бред получается....во where ты должен пихать реальные данные

-~{}~ 11.03.09 18:48:

[sql]
SELECT a.* FROM test_signs as a LEFT JOIN test_user as b ON a.name=b.name WHERE b.id='1' and b.data_birdth BETWEEN (DATE_FORMAT( 'нормальная дата' , '%d-%m'))
AND (DATE_FORMAT( 'нормальная дата' , '%d-%m' ))
[/sql]
 

kolyazdv

Новичок
Нужно проверить `data_birdth` из таблицы `test_user` для конкретного пользователя в какой диапозон входит
`bdata` - начальная дата и `edata` конечная(знаки зодиака)
год при этом должен не учитываться, только месяц и число
 

findnext

Новичок
kolyazdv
так и подставь в тот запрос который я написал реальную дату

-~{}~ 11.03.09 19:24:

[sql]
SELECT a . *
FROM test_signs AS a
LEFT JOIN test_user AS b ON a.name = b.name
WHERE b.id = '1' AND DATE_FORMAT(b.data_birdth, '%d-%m')
BETWEEN (
DATE_FORMAT( 'нормальная дата', '%d-%m' )
) AND (
DATE_FORMAT( 'нормальная дата', '%d-%m' )
)
[/sql]

-~{}~ 11.03.09 19:26:

короче тут нужно приложить минимум усилия но суть такая...это не точный запрос...времени нет переписать...
я то думал что у тебя через name таблицы связаны...
 

kolyazdv

Новичок
SELECT a. *
FROM test_signs AS a
LEFT JOIN test_user AS b ON a.name = b.name
WHERE b.id = '1'
AND DATE_FORMAT( b.data_birdth, '%d-%m' )
BETWEEN (
DATE_FORMAT( '0000-09-10', '%d-%m' )
)
AND (
DATE_FORMAT( '0000-09-21', '%d-%m' )
)



id name pass data_birdth
1 Вася 1 0000-09-20

Возращает пустой результат
 

findnext

Новичок
[sql]
SELECT *
FROM `test_signs`
WHERE DATE_FORMAT( (

SELECT `test_user`.`data_birdth`
FROM `test_user`
WHERE `test_user`.`id` =1
), '%d.%m' )
BETWEEN DATE_FORMAT( '0000-09-10', '%d.%m' )
AND DATE_FORMAT( '0000-08-10', '%d.%m' )
[/sql]

в таком случае данный запрос правильный только постав во where реальные даты...т.е. не бери их из таблицы
 

kolyazdv

Новичок
SELECT u.id, s.name, DATE_FORMAT( u.data_birdth, '%m-%d' )
FROM `test_user` u
LEFT JOIN `test_signs` s ON ( DATE_FORMAT( u.data_birdth, '%m-%d' ) >= DATE_FORMAT( s.bdata, '%m-%d' )
AND DATE_FORMAT( u.data_birdth, '%m-%d' ) <= DATE_FORMAT( s.edata, '%m-%d' ) )
WHERE u.id =1

вот полученное решение
 
Сверху