检查C#MVC LINQ是否存储的日期为7天



在MVC5控制器LINQ查询中,我想每天向客户发送提醒电子邮件,当时是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();

我不确定上述查询是否是执行此操作的最佳方法

更新我已经更新了.today并测试了此错误

message =" linq到实体不识别方法'system.datetime addmonths(int32)'方法,并且该方法无法转换为存储表达式。"

如果我正确理解您,您可以将邮件发送给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日为3月1日,因此dayNumber应计算为1。因此,也应考虑一个月内的天数。正确数字的计算最终为:

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

在这里, %是modulo操作员,例如, 37 % 31 = 6

请注意,dayNumber = (date.Day + 7) % daysInMonth将在date.Day + 7等于daysInMonth的每个月每天产生0值。因此,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

因此,在leap年中,像2016年一样,2月22日,您不发送邮件(=> 2月29日),而在非统治年中,您会。

,请阅读所有评论。通常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#

最新更新