Sql server T-SQLDateDiff返回结果

Sql server T-SQLDateDiff返回结果,sql-server,tsql,Sql Server,Tsql,我在数据库中尝试了datediff,它返回了荒谬的结果。这怎么可能?我错在哪里?有人能帮我吗 您在此处使用了错误的格式化参数: SET @dat = Convert(Varchar(20),@dal,101) 对于以点分隔的日期,“德语”格式使用代码104 SET @dat = Convert(Varchar(20),@dal,104) 可在此处找到所有格式的列表: 这是一个非常方便的列表;我几乎每天都用它 另外,我认为动态查询中的日期应该介于两个引号之间: SET @sql_stateme

我在数据库中尝试了datediff,它返回了荒谬的结果。这怎么可能?我错在哪里?有人能帮我吗


您在此处使用了错误的格式化参数:

SET @dat = Convert(Varchar(20),@dal,101)
对于以点分隔的日期,“德语”格式使用代码104

SET @dat = Convert(Varchar(20),@dal,104)
可在此处找到所有格式的列表: 这是一个非常方便的列表;我几乎每天都用它

另外,我认为动态查询中的日期应该介于两个引号之间:

SET @sql_statement = 'SELECT datediff(yy,'''+@dat+''',DateEx) FROM ExData '
为什么要以如此动态的方式执行此查询?为什么不

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

并废弃sp_执行?

主要问题是动态查询:

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

如果没有这些引号,查询的计算结果可以是

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:我将使用静态查询no EXEC sp_executesql

解决方案2:或者我将使用带有参数的sp_executesql,但在本例中不使用:

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

你能提供一些样本数据和你看到的荒谬结果吗?还可能指出荒谬的结果到底应该是什么……它返回115年的差异,但真正的差异只是第一天——您需要将日期字符串@dat放在@sql_语句中的单引号中:SET@sql_statement='选择datediffyear',++@dat+',从ExData中选择DateEx'为什么不直接传递'@'。调试101选择“@”dal,DateEx,datediffyy,“@”dal,DateEx忽略“as”必须使用它们,这样它就不会认为userI正要说同样的话-动态SQL是完全不必要的,会让事情变得不稳定。。。。
1900-01-01 00:00:00.000
SELECT datediff(yy,@dal,DateEx), ... FROM ExData 
SET @sql_statement = 'SELECT datediff(yy,@pDate,DateEx), ... FROM ExData '
EXECute sp_executesql  @sql_statement, '@pDate DATE', @pDate = @dal