2015-08-08 80 views
-2

我在我的數據庫中嘗試過datediff,它返回荒謬的結果。怎麼可能?我錯在哪裏?有誰能夠幫助我?T-SQL DateDiff返回荒謬結果

Here is screen of my table in database

DECLARE @sql_statement nvarchar(250) 
Declare @dal date 
declare @dat varchar(20) 
set @dal = '07.08.2015' 
SET @dat = Convert(Varchar(20),@dal,101) 
SET @sql_statement = 'SELECT datediff(yy,'[email protected]+',DateEx) FROM ExData ' 
EXECute sp_executesql @sql_statement 
+1

你能提供一些樣本數據和你看到的*「荒唐」*結果嗎? (可能還*指出* *「荒謬」*結果真的應該是什麼.....) –

+0

這是回報115年的差異,但真正的差異只有一天 – acerr

+0

首先 - 你需要把你的**日期字符串**('@ dat')放入您的'@ sql_statement'中的**單引號**中。 :'SET @sql_statement ='SELECT datediff(year,'''+ @dat +''',DateEx)FROM ExData' –

回答

1

您使用了錯誤的格式參數在這裏:

SET @dat = Convert(Varchar(20),@dal,101) 

對於以點分隔日期(以下簡稱 '德' 格式)使用代碼104

SET @dat = Convert(Varchar(20),@dal,104) 

所有格式的列表可以在這裏找到:https://msdn.microsoft.com/en-us/library/ms187928.aspx 這是一個非常方便的列表;我每天都用它。

而且,我相信你的動態查詢中的日期應該是兩個引號之間:

SET @sql_statement = 'SELECT datediff(yy,'''[email protected]+''',DateEx) FROM ExData ' 

你爲什麼在這樣一個動態的方式執行這個查詢?爲什麼不只是

SELECT datediff(yy, @dat, DateEx) FROM ExData 

並報廢sp_execute?

4

的主要問題是動態查詢:

SET @sql_statement = 'SELECT datediff(yy,'[email protected]+',DateEx) FROM ExData ' 

應該是(請注意雙單引號添加 - >'' '+ @逸+' ''

SET @sql_statement = 'SELECT datediff(yy,'''[email protected]+''',DateEx) FROM ExData ' 

沒有這些引號,查詢可評估爲

SELECT datediff(yy,07/08/2015,GETDATE()) 

因爲

SELECT CONVERT(DATETIME, 07/08/2015) -- SELECT 07/08/2015 -> 0 

1900-01-01 00:00:00.000 

最終的結果是115

溶液#1:我會用一個靜態查詢(無EXEC sp_executesql

SELECT datediff(yy,@dal,DateEx), ... FROM ExData 

溶液#2:或我會使用sp_executesql與參數(但不是在這種情況下):

SET @sql_statement = 'SELECT datediff(yy,@pDate,DateEx), ... FROM ExData ' 
EXECute sp_executesql @sql_statement, '@pDate DATE', @pDate = @dal 
+1

我只是想說同樣的事情 - 動態SQL是完全沒有必要,並使事情不順利.... –