【问题标题】:filtering members based on the age using mysql使用mysql根据年龄过滤成员
【发布时间】:2011-09-16 22:06:26
【问题描述】:

我正在尝试检查特定年龄段的人。我有两个 ComboBoxes,minagecombobox 和 maxagecombobox,值在 1 到 120 之间。

我想得到年龄在这两个值之间的人(例如我想过滤掉年龄在 18 到 24 之间的人)。

这是成员表结构:

     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

【问题讨论】:

  • 到目前为止你做了什么?
  • 你用什么来显示 UI / 组合框? PHP、ASP .NET、WinForms 等等……?请适当标记。
  • 组合框让你迷失了方向。您是否只想从当前数据库中选择介于特定年龄之间的人?或者你想做什么?组合框不是 mySQL,它们是您用来与数据库交互的任何语言。请澄清。
  • @Yuck:组合框是红鲱鱼恕我直言——它们与问题没有任何关系。
  • @errorcode105:它甚至告诉你错误在哪里。在参考文献中查找CURDATE() 是不是太过分了? dev.mysql.com/doc/refman/5.5/en/…

标签: mysql sql


【解决方案1】:

试试这个:

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

WHERE 子句有年龄计算公式。当前年份减去出生年份得到年数,如果当前日期和月份小于出生日期和月份,则进一步减1。如果遇到数据类型不匹配错误,请使用STR_TO_DATE(member_dob, '%Y-%M-%d') 将字符串 DOB 转换为 DATETIME DOB。

【讨论】:

  • 请注意,随着所有字符串和日期操作的进行,此查询在超过 100k 行的任何内容上都会非常缓慢。
  • @Piskvor 同意。在这种情况下,OP 应该首先将“minage”和“maxage”转换为实际日期,然后在查询中使用这两个日期。
  • 您使用了YEAR(CURDATE(members.member_Dob))-YEAR(),但我提到了YEAR(CURDATE())-YEAR(members.member_dob),请修正您的问题。
【解决方案2】:

不完全确定您要做什么。您的问题没有多大意义,因为组合框不是 mySQL,它们是您用来与数据库交互的任何语言。您最好以编程方式确定日期范围并将动态变量传递给 mySQL,但现在这里是一个概念。另外,为什么 member_dob 是一个字符串?让它成为一个日期时间......

SELECT * FROM Member 
WHERE STR_TO_DATE(member_dob, '%Y-%M-%d') BETWEEN '1900-0916' AND CURDATE()

【讨论】:

    【解决方案3】:

    重构 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 、月份和日期是从今天开始)。

    无论如何,您都需要将出生日期转换为某种日期 - 这种方法允许您将数据库用于数据搜索,这是它非常擅长的事情(而不仅仅是使用它作为数据存储)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 2020-10-02
      • 2021-10-22
      • 1970-01-01
      相关资源
      最近更新 更多