我有一个开始日期和结束日期,所以如何使用它们来代替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';
但显示已成功编译,但在结果时未显示错误。我被困在这里! 请有人帮我解决一下吗?谢谢!
答案 0 :(得分:0)
这些是您的代码生成的命令:
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);
你得到:
消息529,级别16,状态2,行1从数据类型显式转换 不允许使用int。
可以成功执行以下命令:
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)+''')))';