2015-08-08 79 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是完全没有必要,并使事情不顺利.... –