C#DateTime从linq到分钟

时间:2016-01-26 23:53:38

标签: c# linq datetime

我试图比较DateTimes和SQL条目中的两分钟DateTime.Now。我发现问题是由于从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();

有任何建议吗?

4 个答案:

答案 0 :(得分:7)

我将假设你正在使用Entity Framework。 如果您只需将日期时间比较到分钟,则可以使用System.Data.Entity.DbFunctions访问linq-to-entities中的规范函数。 您可以使用它,例如:

cc.DBAppointments
  .Where(c => DbFunctions.DiffMinutes(c.StartDate,DateTime.Now) == 0 && c.Approved == 1)
  .ToList();

通过这种方式,您可以访问高级sql日期时间比较,并且不必为您的DateTime.Now添加秒/毫秒。此功能将忽略小于分钟的所有内容

答案 1 :(得分:4)

您正在对DateTime.Now进行多次引用,每次都可能具有不同的值。以下应该会更好:

var now = DateTime.Now;
var toGrab = now.Date.AddHours(now.Hour).AddMinutes(now.Minute + 10);

请注意,为了获得明确的“最新结果”,在日期中添加小时和分钟比尝试删除秒和毫秒更有效,因为DateTime中的详细信息比毫秒更多

答案 2 :(得分:1)

更改

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.3732015-12-10 10:33:48.374不同,即使它们相差1毫秒。如果您想获得更广泛的范围,可以c.StartDate >= startDate && c.StartDate <= endDate && c.Approved == 1

答案 3 :(得分:1)

您可以执行comparisons on TimeSpan个对象,这意味着您可以这样做:

cls
$string = "test3.832test"
$string = "test6.832test"
#$pattern = "(\d[0-5].\d{0,3})"
#EDIT TO ADD THIS NEW PATTER
$pattern - "(\d\.?\d{0,2})"
if($string -match $pattern){
    Write-Host "yay" $Matches[1]
}

当然,如果将来TimeSpan oneMinute = new TimeSpan(0, 1, 0); cc.DBAppointments.Where(c => DateTime.Now.AddMinutes(10).Subtract(c.StartDate) < oneMinute && c.Approved == 1).ToList(); 小于9 分钟,则减法的结果将为<-1分钟。我不确定你的目标是否在1分钟内 。如果是这种情况,您可以在等式中添加.Duration(),这将返回TimeSpan的绝对值:

c.StartDate