SqlFunctions将字符串转换为日期

时间:2014-04-11 13:41:50

标签: asp.net-mvc linq sql-function datepart sql-date-functions

我正在处理一个项目,而且我有按日期过滤记录的问题。 我有一个通用的方法来搜索任何实体的记录,我的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

将此字符串转换为日期的方法

1 个答案:

答案 0 :(得分:-1)

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

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

@MyDate已经是参数,您将在查询中包含具有明确日期类型的参数从不生成在查询中直接替换值的查询。