【问题标题】:Conditional dateadd in procedure在过程中添加条件日期
【发布时间】:2017-03-30 00:31:09
【问题描述】:

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

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

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

select dateadd(@interval, @duration, @startdate)

为 dateadd 指定的参数 1 无效。

任何人都可以指导我吗?

【问题讨论】:

  • 只有一些变化,所以你可以这样做:CASE @interval WHEN 'DD' THEN DATEADD(DD... 顺便说一句,你将能够控制输入值。
  • 你不能使用这样的参数。您必须使用动态 sql 或涵盖所有选项的 case 表达式。实际上,您应该避免使用这些快捷方式。为什么不拼出 Day 这样你就不必记住魔法密码了? sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/…

标签: sql sql-server tsql


【解决方案1】:

类似这样的:

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

【讨论】:

    【解决方案2】:

    一种方法是使用动态 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;
    

    问题在于第一个参数是关键字,而不是字符串。所以,不能作为参数传入。

    【讨论】:

    • 感谢 G,将此添加到我的知识库中,但在这种情况下没有使用
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 2017-02-11
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多