如何在Linq to SQL中添加日期
我正在写这段代码。 这里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#中,您可以在日期时间中添加一个double作为日期。 意思是你可以添加1.5天。 在T-SQL中,您只能添加1天,然后再添加12小时。 您必须为每个部件添加一个int。 因此,当Linq将AddDays转换为T-SQL时,它会将我的天数转换为毫秒,并添加这些天数。 这允许它给出double赋予C#的所有精度。
这是擦。 当这到达SQL时,我收到错误:
数据类型日期的日期函数dateadd不支持datepart毫秒
基本上你不能在一个日期添加毫秒。 开玩笑吧。 但是我如何获得翻译的内容呢? 我想将int天添加到日期。 唯一想要这样做的是将它们的负面添加到我正在比较的另一个人身上吗? 如果我想在添加到列时与列进行比较,该怎么办?
更新1
Keith写道,至少从SQL Server 2000开始,T-SQL支持像datepart(毫秒,10000,myDate)这样的命令。这个错误表明你使用的数据库不支持毫秒日期部分,这对我来说似乎很奇怪。
请注意我使用的是SQL Server 2008.DATE数据类型不支持它。 它在datetime上受支持。
如果您使用的是Entity Framework,请使用System.Data.Objects.EntityFunctions,如下所示:
c.CMT_TS > System.Data.Objects.EntityFunctions.AddDays(e.Call.CALL_TS, 1)
我刚刚将列更改回DateTime。
您可以将调用AddDays
从SQL部分移动到.NET部分:
a.Exp.Value >= new DateTimeOffset(dt).AddDays(-Convert.ToDouble(Someint))
看起来这种情况大多是在.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。 这似乎是一个边缘案例,缺少4.5中LINQ 2 SQL框架的测试覆盖率
之后创建一个新的DateTime
对象并使用AddDays
方法:
new DateTime(t.Key.Year,t.Key.Month,T.Key.Day).AddDays(xx)
如果您要比较两个日期,也可以使用SqlMethods.DateDiffDay方法
您可以使用: System.Data.Entity.DbFunctions.AddDays(YourDateTime, NumberOfDays)
此函数将被转换为有效的SQL Query。 类System.Data.Entity.Core.Objects.EntityFunctions
也包含AddDays函数已过时。
您是否考虑编写自己的用户定义函数,基本上接受int(天数)和日期,返回dateadd()的结果? 然后将其拉入项目中的LINQ类。 然后,不是调用.AddDate(),而是调用UDF – 这将允许您将所有内容保存在LINQ查询中,而无需手动拼凑SQLCommand。
如果您首先将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拥有所有的东西,那么我认为你可以更有效地处理。
干杯