C#从linq开始,日期时间缩短到分钟
我正在尝试比较两个C#从linq开始,日期时间缩短到分钟,c#,linq,datetime,C#,Linq,Datetime,我正在尝试比较两个DateTimes和一个SQL条目。我发现问题在于,由于从DB返回的类型,滴答声稍微变小了。但是我想不出一个解决办法 这是我要抓取的DateTime DateTime toGrab = DateTime.Now.AddMinutes(10) .AddSeconds(-DateTime.Now.Second) .AddMilliseconds(-Dat
DateTimes
和一个SQL条目。我发现问题在于,由于从DB返回的类型,滴答声稍微变小了。但是我想不出一个解决办法
这是我要抓取的DateTime
DateTime toGrab = DateTime.Now.AddMinutes(10)
.AddSeconds(-DateTime.Now.Second)
.AddMilliseconds(-DateTime.Now.Millisecond);
这是我的linq表情
cc.DBAppointments.Where(c => c.StartDate == toGrab && c.Approved == 1).ToList();
有什么建议吗?更改
DateTime toGrab = DateTime.Now.AddMinutes(10)
.AddSeconds(-DateTime.Now.Second)
.AddMilliseconds(-DateTime.Now.Millisecond);
到
另一方面,你有什么理由需要预约精确到毫秒的时间吗?似乎很容易丢失记录
编辑
此外,在您的数据库中,值
2015-12-10 10:33:48.373
与2015-12-10 10:33:48.374
不同,即使它们相隔1毫秒。如果您想获得更广泛的范围,可以执行c.StartDate>=StartDate&&c.StartDate您正在对DateTime.Now
进行多次引用,每次都可能有不同的值。以下措施应能更好地发挥作用:
var now = DateTime.Now;
var toGrab = now.Date.AddHours(now.Hour).AddMinutes(now.Minute + 10);
请注意,为了获得一个清晰的“分钟顶端”,向日期添加小时和分钟比删除秒和毫秒效果更好,因为DateTime
中的细节比毫秒更多。您可以创建对象,这意味着您可以这样做:
TimeSpan oneMinute = new TimeSpan(0, 1, 0);
cc.DBAppointments.Where(c =>
DateTime.Now.AddMinutes(10).Subtract(c.StartDate) < oneMinute &&
c.Approved == 1).ToList();
我假设您使用的是实体框架
。
如果您只需要比较datetime直到分钟,那么可以使用System.Data.Entity.DbFunctions
访问linq to entities中的规范函数。
您可以使用以下示例:
cc.DBAppointments
.Where(c => DbFunctions.DiffMinutes(c.StartDate,DateTime.Now) == 0 && c.Approved == 1)
.ToList();
这样,您就可以访问高级sql日期时间比较,而不必在日期时间中添加秒/毫秒。此函数将忽略小于分钟的所有内容您正在调用的DateTime。现在
多次,这可能会给您带来不同的结果。请注意,这仍然不会给您一个清晰的“分钟顶部”,因为DateTime
中的细节超过了一毫秒。这比看上去更纯粹,因为EF将DateTime转换为t-SQL函数SysDateTime()
,所以比较与数据库执行查询的时间完全匹配。理论上,当客户机的DateTime
变量最终得到评估时,它可能需要几秒钟的时间。更不用说客户机和服务器时钟之间的差异了(理论上说不上)。这是我总是忘记dbfunctions的诀窍,只是对资源进行了一个小的修改,即System.Data.Entity。
cc.DBAppointments.Where(c =>
DateTime.Now.AddMinutes(10).Subtract(c.StartDate).Duration() < oneMinute &&
c.Approved == 1).ToList();
cc.DBAppointments
.Where(c => DbFunctions.DiffMinutes(c.StartDate,DateTime.Now) == 0 && c.Approved == 1)
.ToList();