Получить напоминание о дне рождения Linq Query, игнорируя год - PullRequest
5 голосов
/ 22 октября 2009

Я использую C # MVC, и мне нужно получить информацию о пользователе, с которым у меня день рождения в ближайшие 20 дней. используя запрос linq to sql, который хочет сравнить только дату и месяц, а не год, чтобы выбрать пользователей, у которых день рождения, в течение следующих 20 дней, любой любезно поможет мне с запросом linq to sql, чтобы получить пользователей, у которых день рождения, в течение следующих 20 дней .

спасибо заранее,

Ответы [ 5 ]

4 голосов
/ 22 октября 2009

Почему бы не сохранить День рождения в локальной переменной, изменить год на текущий, а затем проверить, происходит ли он в следующие 20 дней?

public bool IsBirthdayInNextTwentyDays(DateTime actualBirthday)
{
var birthday = actualBirthday;
birthday.Year = DateTime.Now.Year;

return birthday > DateTime.Now && birthday < DateTime.Now.AddDays(20);
}

Тогда в Linq что-то вроде:

user.Where(u => IsBirthDayInNextTwentyDays(u.Birthday));

Доброжелательность,

Dan

1 голос
/ 27 октября 2012

Это хорошее решение.

 public bool IsBirthdayInNextTwentyDays(DateTime today,DateTime actualBirthday,int days)
 {
        if ((actualBirthday.DayOfYear - today.DayOfYear >= 0) )
        {
            return (actualBirthday.DayOfYear - today.DayOfYear <= days);
        }
        else
        {
            return (actualBirthday.DayOfYear +365 - today.DayOfYear <= days);
        }
  }

SPS Win в обмене

0 голосов
/ 12 декабря 2013
public static bool IsBirthdayInNextXDays(DateTime realDate, DateTime birthdayDate, int numberOfDaysToCheck)
{
    bool isOk = false;

    if ((birthdayDate.DayOfYear - realDate.DayOfYear) <= numberOfDaysToCheck && (birthdayDate.DayOfYear - realDate.DayOfYear) >= 0)
        isOk = true;

    return isOk;
}
0 голосов
/ 06 ноября 2009

Используйте свойство DateTime.DayOfYear, чтобы получить целое число; 1 января == 1, последний день года = 365/366.

Наивные версии используют что-то вроде

where user.Birthday.DayOfYear - DateTime.Now.DayOfYear > 20

Это не работает, когда год заканчивается - где текущий день в конце декабря, а день рождения пользователя в начале января. Но начните с DateTime.DayOfYear

0 голосов
/ 30 октября 2009

Вот один из способов сделать это. Мне не очень нравится, как компьютер сначала «отмечает день рождения в этом году», а потом исправляет его, если он уже прошел, но я не мог придумать лучшего способа в короткие сроки.

from p in Persons
let thisYearsBirthday = p.Birthdate.AddYears(today.Year - p.Birthdate.Year)
// OR this way, although the SQL it produces it a little less simple
// let thisYearsBirthday = new DateTime(today.Year, p.Birthdate.Month, p.Birthdate.Day)
let nextBirthday = (thisYearsBirthday >= today) ? thisYearsBirthday : thisYearsBirthday.AddYears(1)
where nextBirthday >= today && nextBirthday <= today.AddDays(20)
select new { /* ... */ };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...