程序中的条件dateadd

时间:2017-03-29 16:15:26

标签: sql sql-server tsql

我有一个接收3个参数的程序:

<div id="results">
  <div class="container">
  </div>
  <div class="row"></div>
  <div class="col"></div>0 Col
  <div class="col"></div>1 Col
  <div class="col"></div>2 Col<br>
  After container
  </div>

我需要做的是根据上述内容输出一个新日期。由于@interval不正确,因此dateadd不起作用。

@startdate  = '2017-01-01'
@interval   = 'DD'
@duration   = 5
  

为dateadd指定的参数1无效。

有人能引导我吗?

3 个答案:

答案 0 :(得分:4)

这样的事情:

select case @interval
  when 'yy' then DateAdd(Year, @duration, @startdate) 
  when 'qq' then DateAdd(Quarter, @duration, @startdate) 
  when 'mm' then DateAdd(Month, @duration, @startdate) 
  when 'wk' then DateAdd(WeeK, @duration, @startdate) 
  when 'dd' then DateAdd(Day, @duration, @startdate) 
  when 'hh' then DateAdd(Hour, @duration, @startdate) 
  when 'mi' then DateAdd(Minute, @duration, @startdate) 
  when 'ss' then DateAdd(Second, @duration, @startdate)
else null
end

答案 1 :(得分:4)

一种方法是使用动态SQL。另一个是巨大的case陈述。类似的东西:

declare @endDate date;
declare @sql nvarchar(max);

set @sql = 'select @endDate = dateadd(@interval, @duration, @startdate)';
set @sql = replace(@sql, '@interval', @interval);

exec sp_executesql @sql, N'@duration int, @startdate date, @endDate date output',
                   @duration = @duration, @startdate = @startdate,
                   @endDate = @endDate output;

问题是第一个参数是关键字,而不是字符串。因此,它不能作为参数传递。

答案 2 :(得分:3)

您将需要CASE,因为无法动态提供参数:

select case @interval
  when 'dd' then DATEADD(dd, @duration, @startdate)
  when 'mm' then DATEADD(mm, @duration, @startdate)
  ...
end