我正在处理一个项目,而且我有按日期过滤记录的问题。 我有一个通用的方法来搜索任何实体的记录,我的searchQuery就像是' 2014-03-15'并且记录日期时间格式为' 2014-03-15 00:00:00.000',我的sql查询应该只将datetime sql记录转换为日期格式,然后将其与我的查询进行比较,问题是这个从记录中生成的日期不是我的查询的eqauls,我使用datepart函数然后结束字符串结果,但结果将像 ' 2014- 3-15'并且没有匹配,如果有一种方法可以将字符串转换为sqlfunctions中的日期,那将是很好的,这是我的代码
var date = Expression.Convert(propExp, typeof(Nullable<DateTime>));
var datePart = typeof(SqlFunctions).GetMethod("DatePart",
new Type[] { typeof(string), typeof(Nullable<DateTime>) });
var month = Expression.Call(datePart, Expression.Constant("MM"), date);
var toDouble = Expression.Convert(month, typeof(Nullable<double>));
var monthPartToString = typeof(SqlFunctions).GetMethod("StringConvert",
new Type[] { typeof(Nullable<double>) });
var monthPart = Expression.Call(monthPartToString, toDouble);
var dd = Expression.Call(datePart, Expression.Constant("dd"), date);
var toDoubledd = Expression.Convert(dd, typeof(Nullable<double>));
var ddPartToString = typeof(SqlFunctions).GetMethod("StringConvert",
new Type[] { typeof(Nullable<double>) });
var ddPart = Expression.Call(ddPartToString, toDoubledd);
var yy = Expression.Call(datePart, Expression.Constant("yyyy"), date);
var toDoubleyy = Expression.Convert(yy, typeof(Nullable<double>));
var yyPartToString = typeof(SqlFunctions).GetMethod("StringConvert",
new Type[] { typeof(Nullable<double>) });
var yyPart = Expression.Call(yyPartToString, toDoubleyy);
var conCat4 = typeof(string).GetMethod("Concat",
new Type[] { typeof(string), typeof(string), typeof(string), typeof(string) });
var conCat2 = typeof(string).GetMethod("Concat",
new Type[] { typeof(string), typeof(string) });
var delim = Expression.Constant("-");
stringProp = Expression.Call(conCat2, Expression.Call(conCat4, yyPart, delim, monthPart, delim), ddPart);
经过处理的sql是
select * from orders where STR( CAST( DATEPART(yyyy, CreatedOn) AS float)) + N'-' + STR( CAST( DATEPART(MM,CreatedOn) AS float)) + N'-' + STR( CAST( DATEPART(dd, CreatedOn ) AS float)) LIKE N'%2014-03-15%'
我需要一种通过sqlFunctions
答案 0 :(得分:-1)
不要使用字符串来比较日期。的 EVER 即可。相反,请记住,从Sql Server 2008开始,有Date
类型只存储日期信息,没有时间组件。您应该生成将比较的两边都转换为该类型的sql,如下所示:
select * from orders where cast(CreatedOn As Date) = @MyDate
@MyDate已经是参数,您将在查询中包含具有明确日期类型的参数。 从不生成在查询中直接替换值的查询。