LINQ日期时间查询忽略毫秒

3

x.CreateDateDateTime数据存储在我们的数据库中,包括毫秒。我的dateTimePicker值“开始日期”和“结束日期”只允许查询到秒。

如何更改我的查询以忽略x.CreateDate的毫秒?我以为我下面写的代码会起作用,但实际上并没有。

if (stardDateIsValid && endDateIsValid && startdate == enddate)
    query = _context.Logs
        .Where(x => x.ApplicationID == applicationId &&
                    x.CreateDate.AddMilliseconds(-x.CreateDate.Millisecond) == startdate)
        .OrderByDescending(x => x.ID)
        .Take(count);

当你说“它不起作用”时,你应该告诉我们它以什么方式不起作用。 - DavidG
谢谢。它返回了零结果。 - user2415620
startdate 是什么格式? - Tim Freese
没有提供要翻译的内容。请提供需要翻译的原始文本以便我进行翻译。 - user2415620
4个回答

2
var query =  from l in _context.Logs
             where l.ApplicationID == applicationId
             && SqlMethods.DateDiffSecond(l.CreateDate,startdate) == 0
             orderby l.ID descending
             select l).Take(count);

这样做避免了将表中每个日期都转换为字符串并进行后续的字符串比较,而是将两个日期作为日期进行比较。

谢谢James,但是因为l.CreateDate的值包括毫秒而startdate没有,如果我理解正确的话,它永远不会返回任何结果?我已经添加了Sqlmethods的程序集引用并尝试了一下。没有错误,但也没有返回任何结果。 - user2415620
1
@user2415620 DateDiffSecond 只比较秒数的差异。(我使用 Northwind 数据库进行了测试,在午夜后半秒开始计时) - James Curran

1
获取CreateDatestartdate相同的格式将有助于您进行苹果到苹果的比较。这应该可以实现。
if (stardDateIsValid && endDateIsValid && startdate == enddate)
    query = _context.Logs
        .Where(x => x.ApplicationID == applicationId &&
                    x.CreateDate.ToString(@"MM/DD/YYYY h:mm:ss") == startdate.ToString(@"MM/DD/YYYY h:mm:ss")
        .OrderByDescending(x => x.ID)
        .Take(count);

谢谢,但仍然没有返回结果。 `code _context.Logs {SELECT [Extent1] .[ID] AS [ID],[Extent1] .[Message] AS [Message],[Extent1] .[ApplicationID] AS [ApplicationID],[Extent1] .[CreateDate] AS [CreateDate],[Extent1] .[Data] AS [Data] FROM [dbo] .[Log] AS [Extent1]} base:{SELECT [Extent1] .[ID] AS [ID],[Extent1] .[Message] AS [Message],[Extent1] .[ApplicationID] AS [ApplicationID],[Extent1] .[CreateDate] AS [CreateDate],[Extent1] .[Data] AS [Data] FROM [dbo] .[Log] AS [Extent1]} Local:计数= 0 - user2415620
1
x.CreateDate.ToString(@"MM/DD/YYYY h:mm:ss") == startdate.ToString(@"MM/DD/YYYY h:mm:ss") - Ciro Corvino

1

我不知道为什么我无法从上面发布的查询中获得任何结果,因为我尝试了几种不同的主题变化。然而,通过将毫秒添加到startdate和enddate变量中,我成功地使其正常工作。

if (stardDateIsValid && endDateIsValid)
   startdate = startdate.AddMilliseconds(000);
   enddate = enddate.AddMilliseconds(999);
   query = _context.Logs.Where(x => x.ApplicationID == applicationId && x.CreateDate >= startdate && x.CreateDate <= enddate).OrderByDescending(x => x.ID).Take(count);

1
startdate = startdate.AddMilliseconds(000); 这行代码没有任何作用,可以删除。enddate = enddate.AddMilliseconds(999); 可以简化为 enddate = enddate.AddSeconds(1); 然后变成 x.CreateDate < enddate - James Curran

0

你可以创建扩展方法。

public const long TicksPerMillisecond = 10000;
public const long TicksPerSecond = TicksPerMillisecond * 1000;

public static bool IsEqualIgnoreMilliseconds(this DateTime date, DateTime compareDate)
{
    long tickDiff = date.Ticks - compareDate.Ticks;
    return tickDiff > 0 ? tickDiff < TicksPerSecond : tickDiff < -TicksPerSecond;
}

然后你可以使用这个:

if (stardDateIsValid && endDateIsValid && startdate == enddate)
    query = _context.Logs
    .Where(x => x.ApplicationID == applicationId &&
                x.CreateDate.IsEqualIgnoreMilliseconds(startdate)
    .OrderByDescending(x => x.ID)
    .Take(count);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接