簡體   English   中英

檢查C#MVC Linq如果存儲日期是7天之后

[英]Check C# MVC Linq If a stored date is 7 days away

在一個MVC5控制器Linq Query中,我希望每天向我的客戶發送一封提醒電子郵件,當時是指定日期的7天。 這個日期不是一個完整的日期,它只是作為int(1到28)存儲在mysql數據庫中的月份的日值。 所以我有一個hangfire后台腳本,它將每天檢查這種情況並向滿足這種情況的客戶發送電子郵件

var rem = db.DDs.Where(a => (new DateTime(DateTime.Today.Year, DateTime.Today.Month,a.Day).AddMonths(1)==DateTime.Today.AddDays(7))).ToList();

我不確定上述查詢是否是執行此操作的最佳方式

更新我已更新.NOW到。今天並測試得到此錯誤

Message =“LINQ to Entities無法識別方法'System.DateTime AddMonths(Int32)'方法,並且此方法無法轉換為商店表達式。”

請閱讀該問題的所有評論。 通常DateTime存儲日期和時間部分。 因此,您已將查詢更改為:

DateTime dbeg = DateTime.Today.AddDays(-7);
DateTime dend = dbeg.AddDays(1).AddSeconds(-1);

var rem = db.DDs.Where(a => a>=dbeg && a<=dend).ToList();
//returns data between: #2016-06-11 00:00:00# and #2016-06-11 23:59:59#

如果我理解正確,您只需將郵件發送給a.Day等於整數值的客戶。 由於您每天都這樣做一次,因此您絕不會兩次發送郵件:

var dayNumber = ....
var rem = db.DDs.Where(a => a.Day == dayNumber);

現在的問題是:如何確定dayNumber

顯然,應該使用DateTime.Today.Day ,然后查看提前7天的a.Day值。 那將是:

dayNumber = DateTime.Today.Day + 7;

但是如果DateTime.Today.Day22或更高呢? 然后dayNumber = 29 ,大於28 ,所以你不發送郵件。 或者你呢? 在非閏年,2月22日一周后是3月1日,因此dayNumber應計算為1 因此,也應考慮一個月內的天數。 正確數字的計算最終為:

var date = DateTime.Now;
var daysInMonth = DateTime.DaysInMonth(date.Year, date.Month);
var dayNumber = (date.Day + 6) % daysInMonth + 1;

這里, %是模運算符,例如, 37 % 31 = 6

請注意, dayNumber = (date.Day + 7) % daysInMonth將在每月的每一天產生0值,其中date.Day + 7等於daysInMonth 因此date.Day + 6和后來添加1

只是一些示例輸出:

20-01-16: 27
21-01-16: 28
22-01-16: 29
23-01-16: 30
24-01-16: 31
25-01-16: 1
...
30-01-16: 6
31-01-16: 7
01-02-16: 8
02-02-16: 9
...
20-02-16: 27
21-02-16: 28
22-02-16: 29
23-02-16: 1
24-02-16: 2
...
29-02-16: 7
01-03-16: 8
02-03-16: 9
...
24-03-16: 31
25-03-16: 1
26-03-16: 2
...
31-03-16: 7
01-04-16: 8
02-04-16: 9

因此,在閏年,如2016年2月22日,您不發送郵件(=> 2月29日),而在非閏年,您會發送郵件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM