我想比较这来自剑道过滤器(DD / MM / YYYY HH:MM:SS TT)日期时间格式,并希望与使用LINQ表达我的数据库进行比较。
IEnumerable<ValidateTaskSummaryDetails> source;
source = source.Where(o => o.TaskStartDate.Value == dtStartDate);
这里dtStartDate
来自剑道,我从剑道得到的日期是'10/11/2016 15:34:45'
和我的数据库中的日期是'10/11/2016:15:34:45'
但后来我也也有像错误'Enumeration yielded no results'
我认为,必须把一大堆的日期与.fff
节也,但我不明白,从剑道(即我不想得到它)。
这里的问题是,当我试图以compare both dates
是相同的,但在比较系统相比, 'DD/MM/YYYY hh:mm:ss.fff tt'
现在的问题是'.fff'
由于这个日期是不比较并因此yielded no result
。
做任何有什么解决办法?
这两个日期时间,如果你删除毫秒部分相同。
如果是这样,你可以截断你的毫秒部分TaskStartDate.Value
等;
source = source.Where(o =>
o.TaskStartDate.Value.AddTicks(-(o.TaskStartDate.Value.Ticks % TimeSpan.TicksPerSecond))
== dtStartDate);
当您执行相等比较,你是正确的,比较的完整表示DateTime
,说实话它比较平等Ticks
各财产DateTime
对象。
public static bool operator ==(DateTime d1, DateTime d2) {
return d1.InternalTicks == d2.InternalTicks;
}
(来自参考源 )
如果你只需要日期(年,月,日)和时间的平等(小时,分,秒),您需要实现类似以下内容:
IEnumerable<ValidateTaskSummaryDetails> source;
source = source.Where(o => o.TaskStartDate.Value.Year == dtStartDate.Year &&
o.TaskStartDate.Value.Month == dtStartDate.Month &&
o.TaskStartDate.Value.Day == dtStartDate.Day &&
o.TaskStartDate.Value.Hour == dtStartDate.Hour &&
o.TaskStartDate.Value.Minute == dtStartDate.Minute &&
o.TaskStartDate.Value.Second == dtStartDate.Second);
或在要求的格式比较字符串表示的平等。
var format = "dd/MM/yyyy HH:mm:ss";
source = source.Where(o => o.TaskStartDate.Value.ToString(format) == dtStartDate.ToString(format));
第一种方法会更快,因为它需要比较数字字段,而不是string
。 应该指出的(因为它从评论中指出),该转换DateTime
为字符串,并比较它的字符串表示是一种坏主意,这是不好的气味代码很好的例子。 它将给需要的结果,但你应该避免它 - 字符串比较总是比数值比较差。
建议避免的相等比较DateTime
的目的,因为存在其影响结果太多变量(小时,分,秒,星期,月,年,毫秒)和仅执行不等式比较(<,<=,>,> =)。 或只比较Date
的分量DateTime
如下:
source = source.Where(o => o.TaskStartDate.Value.Date == dtStartDate.Date);
这是经常足够的这种最常见的用法。
文章来源: How to compare datetime (only dd/mm/yyyy hh:mm:ss tt not whole fff section in datetime) in linq C#?