0

我正在尝试将 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

这是一种非常丑陋的方法,但它确实有效。希望对各位有帮助!

4

3 回答 3

0

您可以使用 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 提供程序,此时您将有一个更具可读性的查询开始:)

于 2013-12-09T09:38:23.400 回答
0

尝试这个:

Select 
    blabla 
from 
bla 
 WHERE CAST(@dateEnd AS DATETIME) >= CAST(SPOT_ENDDAT AS DATETIME)
于 2013-12-09T09:37:00.883 回答
0

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

于 2013-12-09T09:39:40.300 回答