我写这个代码。 这里DT是输入的功能,以及someint。 列exp为一个T-SQL日期列上,它通过一个的LINQ日期时间。
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,将其转换我的天数,以毫秒为单位,并增加了这些。 这使得它可以把所有的精密双给C#。
这里是擦。 当此获取到SQL,我得到的错误:
日期部分毫秒不被用于数据类型日期时间函数DATEADD支持
基本上你不能添加毫秒的日期。 好了不开玩笑。 但我怎么得到的东西,在这里翻译? 我想INT天添加日期。 是唯一的希望这样做对他们的负面添加到其他人,我比较反对? 如果我想比较的列,同时增加了一个?
更新1
基思写道,这样的命令DATEPART(毫秒,10000,指明MyDate)已经在T-SQL,因为至少SQL Server 2000的这个错误提示,无论数据库使用的是不支持毫秒日期部分,这似乎很奇怪,我一直支持。
请注意,我使用SQL Server 2008中它不支持DATE数据类型。 它支持日期时间。
如果您使用的是实体框架,使用System.Data.Objects.EntityFunctions如下:
c.CMT_TS > System.Data.Objects.EntityFunctions.AddDays(e.Call.CALL_TS, 1)
您可以将呼叫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;
然后你就可以进入流奶与蜜之地。 请注意,我没有叫.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查询。 类System.Data.Entity.Core.Objects.EntityFunctions
其中还包含AddDays功能已经过时了。
你有没有考虑写自己的用户定义的函数,基本上发生在一个int(天数)和日期,返回DATEADD的结果()? 然后拉那到项目中的LINQ类。 然后,而不是调用.AddDate(),打电话给你的UDF - 这将让你在你的LINQ查询的一切,而不必手动拼凑一个SqlCommand。
我解决我的问题与查询。
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();
可能是好主意,如果你首先改变你的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中你所有的东西,那么你可以更用途不同,我认为处理。
干杯