2009-10-22 101 views
4

我正在使用C#MVC,我需要獲取用戶詳細信息誰在未來20天生日。使用LINQ to sql查詢,它只想比較日期和月份,而不是年份,以便在未來20天內獲取生日的用戶,任何人都可以幫助我使用LINQ to sql查詢來獲取在未來20天內生日的用戶。獲取生日提醒Linq查詢忽略年份

在此先感謝,

+0

大表或小桌子?任何基於查詢的解決方案_will_恢復到表掃描,所以我會去一個索引計算列數據庫端,如果你經常檢查和/或如果你檢查大量的記錄... – KristoferA 2009-11-01 11:10:21

回答

3

爲什麼不生日存儲在一個局部變量,在今年更改爲當前一年,然後檢查是否在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)); 

善良,

+0

嗨,感謝您的回覆..問題是我無法將單獨的年份單獨轉換爲當年,因爲它是隻讀類型,我們無法單獨指定年份「birthday.Year = DateTime.Now.Year」。請在這方面幫助我。 – kart 2009-10-22 08:10:24

+3

您不能像這樣爲'DateTime.Year'賦值,因爲它是隻讀屬性,'DateTime'是不可變類型。你*可以做的是用你想要的值創建一個新的'DateTime':'var birthday = new DateTime(DateTime.Now.Year,actualBirthday.Month,actualBirthday.Day;' – Lucas 2009-10-30 18:41:37

+0

另外,當'DateTime現在'是在一年的最後20天嗎?你會發現明年1月的生日嗎? – Lucas 2009-10-30 18:46:31

0

下面是做到這一點的方法之一。我真的不喜歡它計算機「今年的生日」的方式,如果它已經過去,然後糾正它,但我不能在短時間內想到更好的方法。

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

使用DateTime.DayOfYear屬性獲取整數; 1月1日== 1,最後一天= 365/366。

天真的版本使用類似於

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

當打之年包圓這不起作用 - 在當前日期是在12月下旬和用戶的生日在一月初。但從DateTime.DayOfYear

1

這是一個很好的解決方案。

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贏在共享

+0

爲什麼不使用局部變量來存儲計算?它會更容易閱讀。 – 2012-10-27 18:15:42

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