我对今天的生日用户有一个SQL查询。
SELECT * FROM Table_EmployeeInfo WHERE MONTH(DOB) = MONTH(getdate()) and day(DOB)=day(getdate())
但我需要排名前5的用户SQL查询即将到来的生日,而不是今天的用户生日,应该是明天,如果没有机构明天就意味着从下一天开始。
另外,我最近需要前5位用户生日,而不是今天的用户生日。
答案 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)。