我试图比较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();
有任何建议吗?
答案 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.373
与2015-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