0

我正在做一个项目,我在按日期过滤记录时遇到问题。我有一个通用的方法来搜索任何实体的记录,我的 searchQuery 就像“2014-03-15”,记录日期时间格式是“2014-03-15 00:00:00.000”,我的 sql 查询应该转换日期时间sql 仅记录日期格式,然后将其与我的查询进行比较,问题是从记录生成的日期与我的查询不相等,我使用 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

4

1 回答 1

-1

不要使用字符串来比较日期。曾经。相反,请记住,从 Sql Server 2008 开始,有一种Date类型只存储日期信息,没有时间组件。您应该生成将比较双方转换为该类型的 sql,如下所示:

select * from orders where cast(CreatedOn As Date) = @MyDate

其中@MyDate 已经是您将包含在具有显式日期类型的查询中的参数。永远不要生成在查询中直接替换值的查询。

于 2014-04-11T13:48:25.570 回答