在查询中将C#Date与SQL Date进行比较

时间:2013-12-09 09:35:32

标签: c# sql-server datetime to-date

我正在尝试将C#DateTime与存储过程中的SQL服务器DateTime进行比较,但它一直给我转换错误。

起初有人为此制定了Oracle功能:

'Select blabla from bla WHERE (TO_DATE (''' + cast(@dateEnd as varchar(50)) + ''',''yyyy/mm/dd'') >= SPOT_ENDDAT) 

我正在尝试将其更改为SQL,但在SQL中,您没有TO_DATE函数。

有什么想法吗?或者我应该在我的.net程序本身的级别进行更改?如果是,我该怎么办?

编辑:

使用此参数调用我的函数存储过程:

DateTime EndDate = DateTime.Today;

ParamList.Add(new <class>.Parameter("EndDate", ParameterDirection.Input, EndDate, DbType.Date));

存储过程:

ALTER PROCEDURE dbo.uspGetValues
         @EndDate = null;
         AS
         BEGIN
         SET NOCOUNT ON;

         DECLARE @SQL as NVARCHAR(4000)
         Set @SQL = 'SELECT * FROM T_SPOTSHOP_DATA WHERE SPOT_ENDDATE IS NOT NULL'
         if(@EndDate is not null)
         Set @SQL = @SQL + 'AND (' + @EndDate +' <= SPOT_ENDDATE' 

         EXEC(@SQL)

修改解决方案:

对于那些有同样问题的人,我把它固定在另一边。在C#中我会用:

DateTime EndDate = DateTime.Today.toString(yyyy-MM-dd);

ParamList.Add(new <class>.Parameter("EndDate", ParameterDirection.Input, EndDate, DbType.Date));

我在我的存储过程中将其记录为:

EndDate Varchar(50)

SET @SQL = @SQL + 'WHERE CONVERT(DATETIME, '''+ @EndDate +''', 121) >= SPOT_ENDDATE

这是一种非常难看的方式,但它有效。希望它可以帮助你们!

3 个答案:

答案 0 :(得分:1)

您可以使用CONVERT在T-SQL中执行转换,但我不会。

我强烈建议尽可能避免字符串转换。只需使用参数化SQL,并将参数指定为DateTime:

// Assuming dateEnd is a DateTime variable
string sql = "SELECT blabla FROM bla WHERE @dateEnd >= SPOT_ENDDAT";
using (var command = new SqlCommand(conn, sql))
{
    command.Parameters.Add("@dateEnd", SqlDbType.DateTime).Value = dateEnd;
    // Execute the command here
}

我也会为Oracle做同样的事情 - 除非你的任务真的涉及在文本和“本机”数据类型之间进行转换,否则不要这样做。

或者当然使用LINQ提供程序,此时您将有一个更易读的查询:)

答案 1 :(得分:0)

试试这个:

Select 
    blabla 
from 
bla 
 WHERE CAST(@dateEnd AS DATETIME) >= CAST(SPOT_ENDDAT AS DATETIME)

答案 2 :(得分:0)

只需将.Net DateTime值作为参数传递给Sql Command。数据库驱动程序将自动处理到Sql Server日期时间的转换。