C# DateTime 从 linq 下降到分钟
本文关键字:分钟 linq DateTime | 更新日期: 2023-09-27 18:31:57
我正在尝试比较DateTime.Now
和SQL条目中的两个DateTimes
。我看到的问题是由于从数据库返回的那种,刻度略有偏差。但是我无法找到解决方法。
这是我要抓住DateTime
DateTime toGrab = DateTime.Now.AddMinutes(10)
.AddSeconds(-DateTime.Now.Second)
.AddMilliseconds(-DateTime.Now.Millisecond);
还有我的林克表达式。
cc.DBAppointments.Where(c => c.StartDate == toGrab && c.Approved == 1).ToList();
有什么建议吗?
我假设你为此使用Entity Framework
。如果只需要比较到几分钟的日期时间,则可以使用 System.Data.Entity.DbFunctions
访问 linq-to-entity 中的规范函数。例如,您可以使用此功能:
cc.DBAppointments
.Where(c => DbFunctions.DiffMinutes(c.StartDate,DateTime.Now) == 0 && c.Approved == 1)
.ToList();
这样,您就可以访问高级sql日期时间比较,而不必做向DateTime.Now
添加秒/毫秒的技巧。此函数将忽略小于分钟的所有内容。
您正在对 DateTime.Now
进行多次引用,每次可能具有不同的值。以下应该效果更好:
var now = DateTime.Now;
var toGrab = now.Date.AddHours(now.Hour).AddMinutes(now.Minute + 10);
请注意,为了获得清晰的"分钟顶部",在日期中添加小时和分钟比尝试删除秒和毫秒更好,因为DateTime
中的细节比毫秒更多。
更改
DateTime toGrab = DateTime.Now.AddMinutes(10)
.AddSeconds(-DateTime.Now.Second)
.AddMilliseconds(-DateTime.Now.Millisecond);
自
DateTime now = DateTime.Now;
DateTime toGrab = now.AddMinutes(10)
.AddSeconds(-now.Second)
.AddMilliseconds(-now.Millisecond);
另一方面,有什么理由需要将约会时间缩短到精确的毫秒吗? 似乎很容易丢失记录?
编辑
此外,在数据库中,值2015-12-10 10:33:48.373
与2015-12-10 10:33:48.374
不同,即使它们相隔 1 毫秒。 如果你想获得更广泛的范围,你可以做c.StartDate >= startDate && c.StartDate <= endDate && c.Approved == 1
您可以在TimeSpan对象上进行比较,这意味着您可以这样做:
TimeSpan oneMinute = new TimeSpan(0, 1, 0);
cc.DBAppointments.Where(c =>
DateTime.Now.AddMinutes(10).Subtract(c.StartDate) < oneMinute &&
c.Approved == 1).ToList();
当然,如果将来c.StartDate
小于 9 分钟,减法将得到 <-1 分钟的结果。 我不确定您的目标是否在 1 分钟内。 如果是这种情况,您可以将.Duration()
添加到公式中,这将返回 TimeSpan 的绝对值:
cc.DBAppointments.Where(c =>
DateTime.Now.AddMinutes(10).Subtract(c.StartDate).Duration() < oneMinute &&
c.Approved == 1).ToList();