2013-12-09 82 views
0

我想比較C#日期時間與存儲過程中的SQL服務器日期時間,但它不斷給我轉換錯誤。比較C#日期與查詢中的SQL日期

起初別人做這個甲骨文功能:

'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

記得要使您的C#DateTime字符串成爲您在SQL Server中與之比較的SAME格式。 –

+0

這是我的問題,我怎樣才能得到它相同的格式? ^^ – Akorna

回答

0

試試這個:

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

當我嘗試這個,我得到這個錯誤:「System.Data.SqlClient.SqlException:轉換日期和/或時間從字符串轉換失敗」 – Akorna

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 
} 

我會做for Oracle的等效以及 - 除非你真正的任務本質上涉及到文本和「本地」的數據類型,不要」之間轉換不要這樣做。

或者使用過程中的LINQ提供程序,此時你就會有一個更可讀的查詢下手:)

+0

我很想做到這一點,但我正在與一個Dataprovider,所以我正在處理參數列表類似這樣的: 'paramList.Add(new class.Parameter(「EndDate」,Parameter.direction.Input,search.EndDate,DbType。日期)); ' 而且我不能把SqlDbType放在那裏,或者我只是不知道如何,我在數據庫非常糟糕.Accesses – Akorna

+0

@Akorna:好的,如果你使用的'DbType.Date'應該可能夠用了 - 你至少不會將它轉換爲字符串。 –

+0

那麼它仍然給了 'System.Data.SqlClient.SqlException:轉換失敗時,轉換日期和/或時間,從字符string' ......所以出於某種原因他一直某處將其轉換成字符串? – Akorna

0

只需通過淨DateTime值作爲參數傳遞給SQL命令。數據庫驅動程序將自動處理到Sql Server日期時間的轉換。