我在我的数据库中尝试过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
答案 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?