【问题标题】:Comparing DateTime fields with different 'times'比较具有不同“时间”的 DateTime 字段
【发布时间】:2013-06-22 14:02:39
【问题描述】:

我的程序要求用户输入一个日期,然后将其转换为日期时间:

var fromDate = DateTime.Parse(txtFromDate.Text);

我将其转换为 DateTime 字段的原因是因为我想将它与表中的 DateTime 字段进行比较,如下所示:

var q = gc.GraphicRequests.Where(a => a.DateInWork == fromDate);

但是,有一个问题。当用户输入日期 (6/17/2013) 并将其转换为 DateTime 字段时,结果日期如下所示:6/17/2013 12:00:00 AM

问题是,当我试图在表中查找与该日期匹配的记录时,我没有得到任何命中,因为表中的日期如下所示:6/17/2013 05: 35 AM 或其他时间。所以,日期是正确的,但时间不匹配。

我的问题是,我怎样才能只比较日期而忽略时间?我只想要与该日期匹配的每条记录,无论 DateTime 字段上的时间是什么。

【问题讨论】:

  • 您使用的是哪个查询提供程序? Linq to sql、EF等?

标签: c# linq linq-to-sql


【解决方案1】:

您可以尝试使用Date 属性,它代表当前的DateTime,没有任何Time 部分:

var q = gc.GraphicRequests.Where(a => a.DateInWork.Date == fromDate);

如果DateInWork 可以为空(即DateTime?),请使用:

var q = gc.GraphicRequests.Where(a => 
    a.DateInWork.HasValue && a.DateInWork.Value.Date == fromDate);

但是,如果您使用的是实体框架,您可能需要查看TruncateTime 方法:

var q = gc.GraphicRequests.Where(a =>
    EntityFunctions.TruncateTime(a.DateInWork).Value == fromDate);

【讨论】:

  • 查询提供者知道如何翻译吗?
  • 是否需要某个“使用指令”才能使用此 Date 属性?当我添加 .Date 时,我得到一个波浪形的红色下划线。编辑:我找到了它:System.Date.Time。哇!
  • @JavaRox 该属性的类型是什么?如果是DateTime,它将有一个Date 属性。
  • @Servy 取决于查询提供程序,OP 未指定。
  • @JavaRox 很高兴为您提供帮助。 延伸阅读: Nullable Types (C# Programming Guide)
【解决方案2】:

如果您的查询提供者能够翻译它,这将是在语义上代表您想要做的事情的选项:

var q = gc.GraphicRequests.Where(a => a.DateInWork.HasValue 
    && a.DateInWork.Value.Date  == fromDate);

如果不是,请查看日期是否在一天的开始和结束之间:

DateTime someDate;
DateTime fromDate = someDate.Date, toDate = someDate.Date.AddDays(1);

var q = gc.GraphicRequests.Where(a => a.DateInWork >= fromDate 
    && a.DateInWork < toDate);

【讨论】:

  • 好吧,无论出于何种原因,我都无法将 .Date 附加到 a.DateInWork 字段(可为空的 DateTime?)。所以,我使用了你的第二种情况,当然,它奏效了。我试图避免做这样的事情,因为我确信我可以使用.Date 之类的东西,但我似乎无法让它工作。我可以毫无问题地将 .Date 附加到 fromDate 。它只是不允许我附加到 DateInWork。呃,好吧。我非常感谢您和其他所有人的帮助!
  • @JavaRox 您没有声明您的日期可以为空;这改变了问题。这就是您应该回答clarifying questions asked of you 的原因。如果您不这样做,则很难为您提供帮助。
  • 抱歉,Servy!下次我会更加注意被问到的问题。
  • @JavaRox 如果这个答案(或任何其他)对您有所帮助,即使它不是您最终使用的解决方案,您也应该支持它。它可以帮助其他人知道这是一个有价值的解决方案,将来可能会帮助他们;此外,它还鼓励用户提供良好的、深思熟虑的答案,例如 Servy 的。
【解决方案3】:

如果你使用实体框架,那么使用EntityFunctions.TruncateTime方法:

var q = gc.GraphicRequests
          .Where(a => EntityFunctions.TruncateTime(a.DateInWork) == fromDate);

如果您使用的是 Linq to SQL,那么您可以简单地评估 DateTime.Date 属性。甚至做a.DateInWork.Date.Year &gt; 2000之类的事情。

【讨论】:

  • 他没有使用 EF,he's using linq to sql.
  • @Servy 然后他可以简单地访问Date 属性。之前未指定 BTW 提供程序
  • 我知道,这就是我发表评论的原因,允许您根据新信息编辑您的答案。
猜你喜欢
  • 2016-01-07
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 2018-04-13
相关资源
最近更新 更多