SQL查询-选择超过一定年龄的客户

SQL查询-选择超过一定年龄的客户,sql,oracle,Sql,Oracle,我试图选择65岁以上、余额超过5000英镑的客户 我不知道如何在WHERE子句中成功计算他们的年龄 这是我的代码: SELECT Customer.ID, Customer.lastName, Customer.firstName FROM CUSTOMER INNER JOIN has ON has.ID = CUSTOMER.ID INNER JOIN Account ON Account.ACCNUMBER = has.ACCNUMBER WHERE

我试图选择65岁以上、余额超过5000英镑的客户

我不知道如何在WHERE子句中成功计算他们的年龄

这是我的代码:

SELECT 
    Customer.ID, Customer.lastName, Customer.firstName
FROM 
    CUSTOMER
INNER JOIN 
    has ON has.ID = CUSTOMER.ID
INNER JOIN 
    Account ON Account.ACCNUMBER = has.ACCNUMBER
WHERE 
    Account.BALANCE > 5000 
    AND ((DATEDIFF(DAY, CUSTOMER.DATEOFBIRTH, GETDATE()) / 365.25) > 65)
ORDER BY 
    CUSTOMER.LASTNAME;
我哪里做错了


谢谢你的帮助

如果您使用的是SQL Server数据库,则可以使用以下WHERE子句:

试试这个:

SELECT 
    Customer.ID, Customer.lastName, Customer.firstName
FROM 
    CUSTOMER
INNER JOIN 
    has ON has.ID = CUSTOMER.ID
INNER JOIN 
    Account ON Account.ACCNUMBER = has.ACCNUMBER
WHERE 
    Account.BALANCE > 5000 
    AND Customer.DateOfBirth <= DATEADD(YEAR, -65, SYSDATETIME()) 
ORDER BY 
    CUSTOMER.LASTNAME;

DATEADD从今天开始从当前系统日期减去65年,然后选择所有出生日期在截止日期之前的客户。

年龄是最简单的部分,只需将65年添加到出生日期,然后检查它是否在过去。 您的查询具有可疑的内部联接。都是一对一吗?您可能知道它的详细信息,但至少我会将该部分作为exists查询编写:

SELECT  ID, lastName, firstName
FROM    CUSTOMER
WHERE   DATEADD(YEAR, 65, DATEOFBIRTH) < getdate() AND
        EXISTS ( SELECT *
                 FROM   has
                 INNER JOIN Account ON Account.ACCNUMBER = has.ACCNUMBER
                 WHERE  has.ID = CUSTOMER.ID AND
                        Account.BALANCE > 5000 )
ORDER BY LASTNAME;
哦,您使用的不是MS SQL server,而是Oracle,希望您在问题中指定:

SELECT  ID, lastName, firstName
FROM    CUSTOMER
WHERE   ADD_MONTHS(DATEOFBIRTH, 65*12) < SYSDATE AND
        EXISTS ( SELECT *
                 FROM   has
                 INNER JOIN Account ON Account.ACCNUMBER = has.ACCNUMBER
                 WHERE  has.ID = CUSTOMER.ID AND
                        Account.BALANCE > 5000 )
ORDER BY LASTNAME;

请标记使用的数据库管理系统。这里有一些特定于产品的SQL…用于Postgres:where ageCUSTOMER.DATEOFBIRTH>interval'65'year@a_horse_with_no_name,这就是为什么在我使用的数据库中我最喜欢postgreSQL的原因:其他数据库没有它那么先进。谢谢回复@marc_s!上面的代码给了我一个错误,上面写着DATED:invalid identifier。如果这有什么不同,我正在使用SQL Developer?谢谢@fabulaspb!上面的代码给了我以下错误-DATEDIFF:无效标识符。如果这有什么不同的话,我使用的是SQL Developer?您使用的是什么数据库?DateDiffyy。。。将忽略对合法退休制度可能很重要的月份。@fabulaspb这是我的课程tute的自定义月份-这就是它不起作用的原因吗?我是说datediffyy。。。甚至不能在MS SQL server上工作。它忽略了月、日部分,只对年部分进行计算。根据datediffyy的数据,2015年12月31日出生的人今天只有1岁。。。。如果这是一个医疗管理的计算,那么婴儿将面临严重的麻烦。谢谢@Cetin Basoz!对不起,我没意识到差别这么大。
SELECT  ID, lastName, firstName
FROM    CUSTOMER
WHERE   ADD_MONTHS(DATEOFBIRTH, 65*12) < SYSDATE AND
        EXISTS ( SELECT *
                 FROM   has
                 INNER JOIN Account ON Account.ACCNUMBER = has.ACCNUMBER
                 WHERE  has.ID = CUSTOMER.ID AND
                        Account.BALANCE > 5000 )
ORDER BY LASTNAME;