Sql server 我需要一个SQL查询前5名即将到来的生日和最近以前的生日

Sql server 我需要一个SQL查询前5名即将到来的生日和最近以前的生日,sql-server,Sql Server,我对today birthdays用户有一个SQL查询 SELECT * FROM Table_EmployeeInfo WHERE MONTH(DOB) = MONTH(getdate()) and day(DOB)=day(getdate()) 但我需要前5名用户SQL查询即将到来的生日,而不是今天用户的生日,它应该是明天,如果没有人将明天意味着采取从未来几天 另外,我需要的是最近前5名用户的生日已经过去,而不是今天的用户生日。您可以使用如下行数功能: SELECT * FROM(

我对today birthdays用户有一个SQL查询

SELECT * FROM Table_EmployeeInfo WHERE MONTH(DOB) = MONTH(getdate()) and day(DOB)=day(getdate()) 
但我需要前5名用户SQL查询即将到来的生日,而不是今天用户的生日,它应该是明天,如果没有人将明天意味着采取从未来几天


另外,我需要的是最近前5名用户的生日已经过去,而不是今天的用户生日。

您可以使用如下行数功能:

SELECT * FROM(
    SELECT t.*,
    row_number() OVER(order by datepart(mm,t.DOB),datepart(dd,t.DOB)) as rnk
    FROM Table_EmployeeInfo t
    where t.DOB > getdate())
WHERE rnk <= 5
混乱,但它可以工作:

select * from (
SELECT datediff(dd,DATEADD(yyyy, DATEDIFF(yyyy, DOB, GETDATE()), DOB),getdate()) as daysSinceBD
,  DENSE_RANK() OVER( ORDER BY datediff(dd,DATEADD(yyyy, DATEDIFF(yyyy, DOB, GETDATE()), DOB),getdate()) desc ) as Ranking
,  * FROM Table_EmployeeInfo 
 where datediff(dd,DATEADD(yyyy, DATEDIFF(yyyy, DOB, GETDATE()), DOB),getdate()) < 0 

 )x   where ranking <=5 order by 1 desc

请在下面选择5个即将到来的生日

SELECT top 5 * FROM Table_EmployeeInfo WHERE CONVERT(DATETIME,
            CONVERT(VARCHAR(10), DOB, 111)) > CONVERT(DATETIME,
            CONVERT(VARCHAR(10), GETDATE(), 111)) order by dob
SELECT top 5 * FROM Table_EmployeeInfo WHERE CONVERT(DATETIME,
            CONVERT(VARCHAR(10), DOB, 111)) < CONVERT(DATETIME,
            CONVERT(VARCHAR(10), GETDATE(), 111)) order by dob
这是过去5个生日的礼物

SELECT top 5 * FROM Table_EmployeeInfo WHERE CONVERT(DATETIME,
            CONVERT(VARCHAR(10), DOB, 111)) > CONVERT(DATETIME,
            CONVERT(VARCHAR(10), GETDATE(), 111)) order by dob
SELECT top 5 * FROM Table_EmployeeInfo WHERE CONVERT(DATETIME,
            CONVERT(VARCHAR(10), DOB, 111)) < CONVERT(DATETIME,
            CONVERT(VARCHAR(10), GETDATE(), 111)) order by dob

我已经在一个有出生日期数据的旧数据库中测试了这些代码,它们很有效。 因为我没有确切的出生日期、时间、时间等,所以我没有处理10个或更多的人在同一天过生日的情况

我使用了OFFSET-FETCH方法,如果将来需要某种分页,它可以帮助您

我不知道你的场景和/或数据模型,但是如果这个查询要频繁运行,而且数据库往往是大的,我建议你考虑一个计算的列周年纪念日,或者任何符合你的数据库名称约定。这是因为您必须使用许多函数来实现所需的功能,这对性能不利。有了计算列,查询的复杂性更低,索引策略更好

请在下面找到我编写的代码,如果有帮助,请告诉我

-- LAST 5 BIRTHDAYS GONE, NOT FROM TODAY
SELECT 
*
FROM 
    Table_EmployeeInfo AS T
WHERE 
    DATEPART(DD, T.DOB) < DATEPART(DD, GETDATE())
AND 
    DATEPART(MM, T.DOB) <= DATEPART(MM, GETDATE())
ORDER BY
     DATEPART(MM, T.DOB) DESC
    ,DATEPART(DD, T.DOB) DESC
OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY

-- NEXT 5 BIRTHDAYS TO COME, NOT FROM TODAY
SELECT 
* 
FROM 
    Table_EmployeeInfo AS T
WHERE 
    DATEPART(DD, T.DOB) > DATEPART(DD, GETDATE())
    AND 
    DATEPART(MM, T.DOB) >= DATEPART(MM, GETDATE())
ORDER BY
     DATEPART(MM, T.DOB) ASC
    ,DATEPART(DD, T.DOB) ASC
OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY

注意:OFFSET-FETCH仅适用于SQL Server 2012或更高版本。如果您使用的是旧版本,请尝试改用TOP5。

表格名称:表格\员工信息和表格字段:名称、DOB、EmailID、提交日期等。。为什么表结构需要@你想要两个单独的查询吗?是的,我想要单独的查询@UbiquitousDevelopersDOB还包含year,若我并没有错的话?若你们在新的一年呢?我需要查询即将到来的和最近的@关键字“WHERE”附近的语法不正确。获取错误@我分别需要两个查询@西纳