Sql server 我需要一个SQL查询前5名即将到来的生日和最近以前的生日
我对today birthdays用户有一个SQL查询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(
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”附近的语法不正确。获取错误@我分别需要两个查询@西纳