2009-10-22 4 views
4

Suis en utilisant C# MVC et je dois obtenir les détails de l'utilisateur qui ont un anniversaire dans les 20 prochains jours. en utilisant linq à sql requête qui veut comparer seulement la date et le mois et pas l'année, pour aller chercher les utilisateurs qui ont anniversaire dans les 20 prochains jours, n'importe qui m'aider avec la requête linq à sql pour obtenir les utilisateurs qui ont anniversaire dans les 20 prochains jours .Recevez un rappel d'anniversaire Linq Query ignorant l'année

merci à l'avance,

+0

Grande table ou une petite table? Toute solution basée sur une requête _will_ retournera aux analyses de table, donc je choisirais une colonne db-cotée calculée si vous vérifiez fréquemment et/ou si vous vérifiez un grand nombre d'enregistrements ... – KristoferA

Répondre

3

Pourquoi ne pas stocker l'anniversaire dans une variable locale, changer l'année pour l'année en cours et de vérifier si elle se produit au cours des 20 prochains jours?

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

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

Puis, en Linq quelque chose comme:

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

Bonté,

Dan

+0

Salut merci pour votre réponse .. le problème est je ne suis pas capable de convertir l'année en particulier à l'année en cours, car il est en lecture seule type dans lequel nous ne pouvons pas attribuer l'année seule "birthday.Year = DateTime.Now.Year". aidez-moi s'il vous plaît à cet égard. – kart

+3

Vous ne pouvez pas affecter une valeur à 'DateTime.Year' comme ceci, car c'est une propriété en lecture seule et' DateTime' est un type immuable. Ce que vous * pouvez * faire est de créer un nouveau 'DateTime' avec les valeurs que vous voulez:' var anniversaire = new DateTime (DateTime.Now.Year, effectiveBirthday.Month, effectiveBirthday.Day; ' – Lucas

+0

Aussi, que se passera-t-il quand' DateTime .Now' est dans les 20 derniers jours de l'année? Voulez-vous trouver des anniversaires à venir en Janvier de l'année prochaine? – Lucas

0

est ici une façon de le faire. Je n'aime pas vraiment la façon dont il ordinateur d'abord "anniversaire de cette année" puis corriger si elle est déjà passé, mais je ne pouvais pas penser à un meilleur moyen en peu de temps.

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 { /* ... */ }; 
0

Utilisez la propriété DateTime.DayOfYear pour obtenir un nombre entier; 1er janvier == 1, dernier jour de l'année = 365/366.

Les versions naïves utilise quelque chose comme

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

Cela ne fonctionne pas lorsque l'année enlace - où le jour est en cours à la fin décembre et l'anniversaire de l'utilisateur est au début de janvier. Mais commencez par DateTime.DayOfYear

1

C'est la bonne solution.

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 dans le partage

+0

Pourquoi n'utilisez-vous pas une variable locale pour stocker votre calcul? –

0
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; 
}