如何在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);

如何在SQL Server或Linq中获取列表生日

我想打印出一份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