在动态过程中需要帮助



我有一个开始日期和结束日期,那么如何使用它们来代替getdate()

我有一个代码,如果开始和结束日期之间的日期间隔小于30,它应该显示开始和结束日期。相反,它显示错误-

Explicit conversion from data type int to date is not allowed.

我没有在任何地方使用int,但它仍然显示我已经尝试在参数传递和其他事情中转换,但它并没有停止显示错误。

我的代码是-

if object_id('ias_test_SCHEMA.week2','p') is not null
drop procedure ias_test_SCHEMA.week2;
go
create procedure ias_test_SCHEMA.week2(@startdate date,@enddate date) 
as
BEGIN
declare @datediff integer,
        @res varchar(30);
set @datediff = DATEDIFF(day, @startdate, @enddate);
if @datediff<=30 
begin
declare @stmt nvarchar(max),
        @stmt1 nvarchar(max);
set @stmt= N'SELECT @res=(DATENAME(DAY,convert(date,'+convert(nvarchar(20),@startdate)+'))  + '' '' + DATENAME(MONTH,convert(date,'+convert(nvarchar(20),@startdate)+')) + '' '' + DATENAME(YEAR,convert(date,'+convert(nvarchar(20),@startdate)+')))';
Execute sp_executesql @stmt, N'@res varchar output',
                             @res=@res output;
print 'The date is:' + @res;
set @stmt1= N'SELECT DATENAME(DAY,convert(date,'+convert(nvarchar(20),@enddate)+')) + '' '' + DATENAME(MONTH,convert(date,'+convert(nvarchar(20),@enddate)+')) + '' '' + DATENAME(YEAR,convert(date,'+convert(nvarchar(20),@enddate)+'))';
Execute sp_executesql @stmt1;
end;
end;
 go

和我执行它的行-

execute ias_test_SCHEMA.week2 '2015-10-03','2015-10-08';

,但它显示编译成功,但在结果时没有显示错误。我被困在这里了!有谁能帮我渡过难关吗?谢谢你!

这些是代码产生的命令:

SELECT @res=(DATENAME(DAY,convert(date,2015-10-03))  + ' ' + DATENAME(MONTH,convert(date,2015-10-03)) + ' ' + DATENAME(YEAR,convert(date,2015-10-03)))
SELECT DATENAME(DAY,convert(date,2015-10-08)) + ' ' + DATENAME(MONTH,convert(date,2015-10-08)) + ' ' + DATENAME(YEAR,convert(date,2015-10-08))

问题在于动态字符串中内置的转换中的日期周围缺少引号。

select convert(date,2015-10-03);

:

Msg 529, Level 16, State 2, Line 1从数据类型显式转换不允许使用Int to date

可以成功执行以下命令:

select convert(date,'2015-10-03');

解决方案是在构建动态查询时添加转义单引号:

set @stmt= N'SELECT @res=(DATENAME(DAY,convert(date,'''+convert(nvarchar(20),@startdate)+'''))  + '' '' + DATENAME(MONTH,convert(date,'''+convert(nvarchar(20),@startdate)+''')) + '' '' + DATENAME(YEAR,convert(date,'''+convert(nvarchar(20),@startdate)+''')))';

最新更新