【问题标题】:How to add day to date in Linq to SQL如何在 Linq to SQL 中添加日期
【发布时间】:2009-08-04 13:49:12
【问题描述】:

我正在编写这段代码。这里 dt 和 someint 都被输入到函数中。 Exp 列是 T-SQL 日期列,通过 Linq 作为 DateTime。

return (from a in dataContext.TableOfA
       where a.name == "Test" &&
       a.Exp.Value.AddDays(Convert.ToDouble(Someint)) >= new DateTimeOffset(dt)
       select a).First();

在 C# 中,您可以将双精度作为日期添加到日期时间。这意味着您可以增加 1.5 天。在 T-SQL 中,您只能添加 1 天,然后是 12 小时。您必须为每个部分添加一个 int。因此,当 Linq 将 AddDays 转换为 T-SQL 时,它会将我的天数转换为毫秒,然后将它们相加。这允许它提供 double 提供 C# 的所有精度。

这就是问题所在。当这到达 SQL 时,我收到错误:

datepart 毫秒不是 由日期函数 dateadd 支持 数据类型日期

基本上,您不能将毫秒添加到日期。好吧,不开玩笑。但是我怎样才能得到可以在这里翻译的东西呢?我想将 int 天数添加到日期中。唯一想这样做是为了将他们的负面因素添加到我正在比较的另一个人身上吗?如果我想在添加列的同时与列进行比较怎么办?

更新 1

Keith 写道,类似的命令 日期部分(毫秒,10000,我的日期) 自从在 T-SQL 中得到支持 至少 SQL Server 2000。这个错误 建议您使用任何数据库 正在使用不支持 毫秒日期部分,这似乎 对我来说很奇怪。

请注意,我使用的是 SQL Server 2008。DATE 数据类型不支持它。它在日期时间上受支持。

【问题讨论】:

  • 至少从 SQL Server 2000 开始,T-SQL 就支持 datepart(millisecond, 10000, myDate) 之类的命令。此错误表明您使用的任何数据库都不支持毫秒日期部分,这对我来说似乎很奇怪。
  • DATE 数据类型不支持。它在日期时间上受支持。
  • 这更有意义。好吧,如果您可以控制数据库设计,那么简单的解决方案就是将此列从 DATE 更改为 DATETIME。显然,如果您问这个问题,这不是您可以控制的吗?

标签: c# datetime linq-to-sql


【解决方案1】:

如果您使用的是实体框架,请使用 System.Data.Objects.EntityFunctions,如下所示:

c.CMT_TS > System.Data.Objects.EntityFunctions.AddDays(e.Call.CALL_TS, 1)

【讨论】:

  • 在 2019 年,EntityFunctions 已弃用。请改用System.Data.Entity.DbFunctions
【解决方案2】:

我刚刚将列改回日期时间。

【讨论】:

    【解决方案3】:

    创建一个新的DateTime 对象,然后使用AddDays 方法:

    new DateTime(t.Key.Year,t.Key.Month,T.Key.Day).AddDays(xx)
    

    【讨论】:

      【解决方案4】:

      您可以将对AddDays 的调用从 SQL 部分移至 .NET 部分:

      a.Exp.Value >= new DateTimeOffset(dt).AddDays(-Convert.ToDouble(Someint))
      

      【讨论】:

        【解决方案5】:

        似乎这种情况在 .NET 4.5 中大部分已修复。

        但是,如果你写:

        var activeProducts = from p in db.Products where DateTime.Now() <= p.EndDate.Date.AddDays(7) select p;
        

        您将收到与 OP 中描述的相同的错误消息。

        但是,如果你写:

        var activeProducts = from p in db.Products where DateTime.Now() <= p.EndDate.AddDays(7) select p;
        

        然后你就可以进入流奶与蜜之地。请注意,我没有在数据库的 DateTime 表示上调用 .Date。这似乎是 LINQ 2 SQL 框架在 4.5 中缺少测试覆盖率的边缘案例

        【讨论】:

        【解决方案6】:

        您可以使用:System.Data.Entity.DbFunctions.AddDays(YourDateTime, NumberOfDays) 此函数将被转换为有效的 SQL 查询。还包含 AddDays 函数的类 System.Data.Entity.Core.Objects.EntityFunctions 已过时。

        【讨论】:

          【解决方案7】:

          如果你想比较两个日期,你也可以使用SqlMethods.DateDiffDay 方法

          【讨论】:

            【解决方案8】:

            我用那个查询解决了我的问题。

            return (from a in dataContext.TableOfA
                   where a.name == "Test" &&
                   DbFunctions.AddHours(DbFunctions.CreateDateTime(
             a.Exp.Value.Year,a.Exp.Value.Month,a.Exp.Value.Day,a.Exp.Value.Hour,a.Exp.Value.Minute,
            a.Exp.Value.Millisecond),Someint) >=     
            DbFunctions.CreateDateTimeOffset(dt.Year,dt.Month,dt.Day,dt.Hour,dt.Minute,dt.Millisecond,0)
                   select a).First();
            

            【讨论】:

              【解决方案9】:

              您是否考虑过编写自己的用户定义函数,该函数基本上接收 int(表示天数)和日期,返回 dateadd() 的结果?然后将其拉入项目中的 LINQ 类。然后,不要调用 .AddDate(),而是调用您的 UDF - 这将允许您将所有内容保留在 LINQ 查询中,而无需手动拼凑 SQLCommand。

              【讨论】:

                【解决方案10】:

                如果您首先将 Sql 查询更改为 Linq 并改为处理 linq 查询,这可能是个好主意。

                只需添加 ToList() 或限制记录

                return (from a in dataContext.TableOfA.ToList()
                   where a.name == "Test" &&
                   a.Exp.Value.AddDays(Convert.ToDouble(Someint)) >= new DateTimeOffset(dt)
                   select a).First();
                

                所以,一旦你在 Linq 中拥有所有东西,我认为你可以更有效地处理。

                干杯

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2016-12-08
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-09-23
                  • 2014-04-04
                  • 2017-07-04
                  相关资源
                  最近更新 更多