如何在SQL Server或Linq中获取列表生日
本文关键字:获取 列表 生日 Linq SQL Server | 更新日期: 2024-09-23 16:21:34
我想在SQL Server中打印出一份10位即将过生日的人的列表,但我还没有找到合适的解决方案。我试过了,但效果不好。请帮帮我。
SQL服务器
SELECT TOP 5 NAME,
birthday,
Datediff(dd, people.birthday, Getdate()) / 365.00 / (
Year(Getdate()) - Year(people.birthday) ) AS DAYS
FROM people
WHERE Datediff(dd, people.birthday, Getdate()) / 365.00 / (
Year(Getdate()) - Year(people.birthday) ) <= 1
ORDER BY days DESC
LINQ
var query =
(from c in db.PEOPLEs
where ((DbFunctions.DiffDays(c.BIRTHDAY, DateTime.Now)/365.25/(DateTime.Now.Year - c.NGAYSINH.Year))<=1)
orderby (DbFunctions.DiffDays(c.BIRTHDAY, DateTime.Now)/365.00/(DateTime.Now.Year - c.BIRTHDAY.Year)) ascending
select c).Take(5);
我想打印出一份10个人的名单,他们的生日即将到来
您可以使用以下LINQ查询:
var query = db.PEOPLEs
.OrderBy(p => p.Birthday.Month > DateTime.Now.Month ||
(p.Birthday.Month == DateTime.Now.Month &&
p.Birthday.Day >= DateTime.Now.Day) ? 0 : 1)
.ThenBy(p => p.Birthday)
.Take(10);
诀窍是有条件的OrderBy
,它确保传入的出生日期在通过的出生日期之前。
这将考虑年底等因素。
select top 10 *
from People
order by (datepart(dy,Birthday)-datepart(dy,getdate())+365) % 365
它通过计算每个生日的dayofyear
(从1-365)相对于当前日期的dayofyear
,并使用模除法(%
)将答案带入0-365的范围,以便正确排序。因此,昨天的生日将被排序为365,明天的生日将排序为1。
UPD
为了考虑下一年的日期,查询已被重写:
Select Top 5 Name, BIRTHDAY
From People
Order by ABS( DATEDIFF( "d", BIRTHDAY, GETUTCDATE() ) ) DESC
这种方法可以正确处理闰年和02/29出生的人。
这很简单
假设这个人今年的生日是什么时候
然后计算上述日期和今天之间的差异天数。
查看以下sql语句:
SELECT TOP 10
NAME,
BIRTHDAY,
DATEDIFF(DAY, GETDATE(), DATEFROMPARTS(YEAR(GETDATE()), MONTH(PEOPLE.BIRTHDAY), DAY(PEOPLE.BIRTHDAY))) AS RemainingDays
FROM PEOPLE
WHERE DATEDIFF(DAY, GETDATE(), DATEFROMPARTS(YEAR(GETDATE()), MONTH(PEOPLE.BIRTHDAY), DAY(PEOPLE.BIRTHDAY))) >= 0
ORDER BY RemainingDays ASC