我正在尝试将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
这是一种非常难看的方式,但它有效。希望它可以帮助你们!
答案 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日期时间的转换。