【问题标题】:How to compare date with milliseconds with LINQ如何使用 LINQ 将日期与毫秒进行比较
【发布时间】:2010-08-25 15:43:17
【问题描述】:

我尝试使用 LINQ to SQL 查询我的数据库。

示例:

var t = from a in context.A where a.date == myDate select a;

问题是来自 SQL 的日期以毫秒返回,myDate 变量包含良好的毫秒,但是当我将日期一起比较时,比较无效,因为 myDate 的默认输出是 MM/dd/yyyy HH:mm: ss 和 sql 返回 MM/dd/yyyy HH:mm:ss:fff。

我怎样才能得到毫秒的日期?

【问题讨论】:

  • édric:你如何构建myDate - DateTime.Parse() 或其他?
  • @p.campbell 不,我的日期是数据库中的值,谁存储在具有日期属性的对象中

标签: c# linq-to-sql datetime


【解决方案1】:

听起来您想将精度为毫秒的 .NET 日期时间与精度为毫秒的 SQL 日期时间进行比较。

在测试中,LINQ To SQL 生成的 SQL 似乎存在缺陷:它不正确地从其内部存储的记号四舍五入到字符串表示。

我已将此提交给 Microsoft Connect:https://connect.microsoft.com/VisualStudio/feedback/details/589054 试试重现!

要解决这个缺陷,即DateTime 中的毫秒在生成的 SQL 中舍入不正确,请考虑挑选日期的每个元素,并比较每个项目(这很荒谬,我知道!):

DateTime d = DateTime.Parse("Jan 1 2010 09:44:33.0110");

var t = m.Msgs.Where(mm => 
                mm.CreatedOn.Value.Date == d.Date
             && mm.CreatedOn.Value.Hour == d.Hour
             && mm.CreatedOn.Value.Minute== d.Minute
             && mm.CreatedOn.Value.Second == d.Second
             && mm.CreatedOn.Value.Millisecond == d.Millisecond);

【讨论】:

  • 一个警告:datetime 列的精度约为 3 毫秒,因此“查找日期”可能会在可表示的日期之间结束。如果该日期也是从日期时间列中读取的,这不是问题
【解决方案2】:

是否有一个日期具有毫秒精度,而另一个没有? 在那种情况下,我会倾向于尝试这样的事情:

var t = from a in context.A where SqlMethods.DateDiffSecond(a.date, myDate) == 0 select a;

page 显示了 Linq to SQL 支持的 DateTime 方法/属性。

【讨论】:

  • 这会导致某些服务器溢出
【解决方案3】:

Check out this link on SO

source = source.Where(o => 
  o.TaskStartDate.Value.AddTicks(-(o.TaskStartDate.Value.Ticks % TimeSpan.TicksPerSecond)) == dtStartDate);

与您面临的问题相同,我在 5 分钟内得到了解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    相关资源
    最近更新 更多