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

时间:2016-02-16 12:47:35

标签: sql-server

我对今天的生日用户有一个SQL查询。

SELECT * FROM Table_EmployeeInfo WHERE MONTH(DOB) = MONTH(getdate()) and day(DOB)=day(getdate()) 

但我需要排名前5的用户SQL查询即将到来的生日,而不是今天的用户生日,应该是明天,如果没有机构明天就意味着从下一天开始。

另外,我最近需要前5位用户生日,而不是今天的用户生日。

4 个答案:

答案 0 :(得分:1)

你可以像这样使用ROW_NUMBER()函数:

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

答案 1 :(得分:0)

凌乱,但它有效:

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

答案 2 :(得分:0)

请尝试以下选择即将到来的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

过去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

答案 3 :(得分:0)

我已经针对具有出生日期数据的旧数据库测试了代码,并且它们有效。 由于我没有出生日期的确切时间(小时等),我没有处理当天有10个或更多人过生日的情况。

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

我不知道您的方案和/或数据模型,但如果要经常运行此查询并且数据库往往很大,我建议您考虑计算列&#34;周年纪念日&#34 ;或符合您的数据库名称约定的任何内容。这是因为你必须使用很多函数来实现你所需要的,这对性能不利。使用计算列,您可以降低查询的复杂性并获得更好的索引策略。

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

-- 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

P.S。:OFFSET-FETCH仅适用于SQL Server 2012或更高版本。如果您使用的是旧版本,请尝试使用TOP(5)。