фильтрация участников по возрасту с использованием mysql - PullRequest
1 голос
/ 16 сентября 2011

Я пытаюсь проверить людей в определенном возрасте.У меня есть два ComboBox, minagecombobox и maxagecombobox, со значениями от 1 до 120.

Я хочу получить людей, чей возраст находится между этими двумя значениями (например, я хочу отфильтровать людей в возрасте от 18 до24).

Это структура таблицы Member:

     member_id 
     member_firstname 
     member_dob(datatype is string) (values like 1987-09-08,1976-09-08,.....)

Я использую MySQL в качестве базы данных .....

**Modified query** 


             SELECT members.member_Id,
                   members.member_Lastname as 'Last Name',
                   members.member_Firstname as 'First Name',
                   members.member_Postcode as 'Post Code',
                   members.member_Reference as Reference,
                   members.member_CardNum as 'Card Number',
                   members.member_IsBiometric as Biometric,
                   members.member_DOB as DoB,
                   mshiptypes.mshipType_Name as Membership,
                   mshipstatustypes.mshipStatusType_Name as Status,
                   membertomships.memberToMship_EndDate as Expiry
                     FROM members
    INNER JOIN membertomships ON membertomships.member_Id = members.member_Id
     INNER JOIN mshipoptions ON mshipoptions.mshipOption_Id = membertomships.mshipOption_Id
    INNER JOIN mshiptypes ON mshiptypes.mshipType_Id = mshipoptions.mshipType_Id
    INNER JOIN mshipstatustypes ON mshipStatusTypes.mshipStatusType_Id = membertomships.mshipStatusType_Id
    WHERE memberToMship_EndDate BETWEEN '2011-09-24' AND '2011-09-30'
    AND members.member_active LIKE 'y%'
    AND (YEAR(CURDATE(members.member_Dob))-YEAR()) - (RIGHT(CURDATE(),5)< RIGHT(member_Dob,5)) BETWEEN '21' AND '102'
    ORDER BY members.member_Lastname

получена ошибка вродеэто .....

     Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'member_Dob))-YEAR()) - (RIGHT(CURDATE(),5)< RIGHT(member_Dob,5)) BETWEEN '21' AN' at line 19

Ответы [ 3 ]

2 голосов
/ 16 сентября 2011

Попробуйте:

SELECT * FROM MEMBER
WHERE (YEAR(CURDATE())-YEAR(member_dob)) - (RIGHT(CURDATE(),5)<RIGHT(member_dob,5)) 
BETWEEN 18 AND 24

Предложение WHERE имеет формулу расчета возраста.Получите число лет, вычитая год рождения из текущего года, а затем дополнительно вычтите 1, если один текущий день и месяц меньше дня и месяца DOB.В случае, если вы получаете ошибку несоответствия типов данных, используйте STR_TO_DATE(member_dob, '%Y-%M-%d') для преобразования строки DOB в DATETIME DOB.

1 голос
/ 16 сентября 2011

Не совсем уверен, что вы пытаетесь сделать.Ваш вопрос не имеет особого смысла, поскольку поля со списком - это не MySQL, а тот язык, который вы используете для взаимодействия с базой данных.Вы бы лучше программно определяли диапазон дат и передавали динамические переменные в mySQL, но сейчас это концепция.Кроме того, почему member_dob строка?Сделай дату и время ....

SELECT * FROM Member 
WHERE STR_TO_DATE(member_dob, '%Y-%M-%d') BETWEEN '1900-0916' AND CURDATE()
0 голосов
/ 16 сентября 2011

Выполните рефакторинг, чтобы member_dob имел тип DATE (или другой тип данных, связанный с датой), затем используйте SELECT member_id, member_firstname, member_dob FROM Member WHERE member_dob BETWEEN '1993-09-16' AND '1987-09-16' (обратите внимание, что 1993 == 2011-18, 1987 == 2011-24, месяц и деньс сегодняшнего дня).

Вам все равно придется преобразовывать дату рождения в какую-то дату - этот подход позволяет вам использовать базу данных для данных при поиске , что довольно неплохо(вместо того, чтобы просто использовать его как хранилище данных ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...