T-SQL DateDiff返回荒谬的结果

时间:2015-08-08 13:42:03

标签: sql-server tsql

我在我的数据库中尝试过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,'+@dat+',DateEx) FROM ExData '
EXECute sp_executesql  @sql_statement

2 个答案:

答案 0 :(得分:4)

主要问题是动态查询:

[1,2,3]

应该是(请注意添加了双单引号 - > SET @sql_statement = 'SELECT datediff(yy,'+@dat+',DateEx) FROM ExData ' ' + @ dat +' ''

''

如果没有这些引号,查询可以评估为

SET @sql_statement = 'SELECT datediff(yy,'''+@dat+''',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

解决方案#1:我会使用静态查询(无115

EXEC sp_executesql

解决方案#2:或者我会使用带有参数的SELECT datediff(yy,@dal,DateEx), ... FROM ExData (但不是在这种情况下):

sp_executesql

答案 1 :(得分: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,'''+@dat+''',DateEx) FROM ExData '

为什么要以这种动态方式执行此查询?为什么不呢

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

并废弃sp_execute?