2015-05-18 67 views
1

我想讓一個程序在SQL Server上執行一些查詢,出於某種原因代碼有奇怪的行爲,因爲它會在我的計算機上創建不同的日期值。在不同的計算機上扮演奇怪的日期時間

這是代碼行爲怪異的一部分。

Query += " dbo.MensajesProcesados.SentDateTime BETWEEN CONVERT(VARCHAR, '" + FechaInicio.Value.ToUniversalTime().ToShortDateString() + "', 103) AND CONVERT(VARCHAR, '" + FechaFin.Value.ToUniversalTime().ToShortDateString() + "', 103)"; 
在第一個計算機(工作)

給我:

BETWEEN CONVERT(VARCHAR, '5/18/2015', 103) AND CONVERT(VARCHAR, '5/19/2015', 103) 

和第二計算機,它不工作:

BETWEEN CONVERT(VARCHAR, '17/05/2015',103) AND CONVERT(VARCHAR, '19/05/2015',103) 

這一個不能正常工作,並會輸出我下面錯誤

將varchar數據類型導致日期時間數據類型導致超出範圍值。

請,任何幫助將是偉大的!

+3

如果停止串聯您的SQL,而使用的參數,這些各種各樣的問題也就不存在了。而且,作爲一項額外功能,您的代碼不會爲SQL注入而廣泛開放。 –

+0

您在問題中顯示了2種不同的日期格式,但您無法向轉換器指定使用何種格式(在提供的示例代碼中)。 convert函數應該如何知道第一個數字是否代表日期時間的月份或日期?您可以更改轉換器使用的格式或日期時間使用的格式(用於字符串輸出),但正確的解決方案是使用params正確執行SQL。 SQL庫可能非常有用,並且提供的不僅僅是執行字符串SQL語句的簡單方法。 – gnomed

+0

@KenWhite問題是,我不知道另一種方法來做我所需要的,如果我不使用連接,因爲我有各種搜索參數,如果文本框中有東西,它會在where子句中使用它,否則它不會,你怎麼能用params來實現呢? –

回答

6

提供Sql Server與文化無關的格式'yyyyMMdd'

Query += " dbo.MensajesProcesados.SentDateTime 
BETWEEN '" + FechaInicio.Value.ToString("yyyyMMdd") + "' 
AND '" + FechaFin.Value.ToString("yyyyMMdd") + "'"; 
+0

如果我想添加時間,我猜這樣的事情,沒有工作壽'FechaInicio.Value.ToUniversalTime()。ToString(「yyyyMMdd」)+「」+ TimeInicio.Value.ToUniversalTime()。ToString(「HHmmss」 )' –

+0

@ pato.llaguno,形成支持:ToString(「yyyyMMdd hh:mm:ss」) –

+0

事情是,我犯了另一個文本框的時候,我無法找到一種方法在同一個文本框中選擇它 –

4

這與SQL Server的文化/語言有關。在這裏看到:SQL Server Datetime issues. American vs. British?

set language us_english 
declare @d datetime = '1929/12/18' 

你可以按照問題的解決方案,手動更改語言,或者您也可以通過月份和年份輸入建立日期,這樣就沒有空間進行翻譯,看到一些問題的答案在這裏:Create a date with T-SQL

DECLARE @day int, @month int, @year int 
SELECT @day = 4, @month = 3, @year = 2011 
SELECT dateadd(mm, (@year - 1900) * 12 + @month - 1 , @day - 1) 

嘗試CONVERT而不是演員。

CONVERT允許指示日期格式的第三個參數。

+0

DateTimeInstance.ToString(「o」)(往返格式)是創建DateTime的非模糊字符串表示形式的可靠方法嗎? –

+0

@SimonCampbell老實說不太清楚,因爲現在你也考慮到了你的編程語言的文化設置。但是你可以在安全性上更加明確,例如在c#'myDateTime.ToString(「yyyy-MM-dd HH:mm:ss」);' –

+1

如果他改變了RDBMS中的語言設置來解決問題,那麼那麼以前工作的案例將會打破。 – gnomed