【问题标题】:Reading a string expression with parameters and executing the expression as date读取带参数的字符串表达式并将表达式作为日期执行
【发布时间】:2015-10-14 09:50:12
【问题描述】:

我正在尝试在 SQL 存储过程中创建用于日期计算的动态代码,但在将字符串表达式和参数作为日期表达式执行时遇到问题。

我想在一个表中保存通用字符串表达式,该表将根据参数的值创建日期。

例如这是一个通用表达式:

DATEADD(@TimeResolution, -@IterationN, @CurrentCalc) 

如您所见,这些泛型表达式由 to 参数组成。

在存储过程中,我打算声明表达式中的变量,并使用来自不同表的 select 语句为它们赋值。

问题是,在导出这些字符串值并编写表达式后,它没有给我想要的日期,但失败了。

例如,如果我编写以下代码

declare @Today date 
declare @LastYear date
set @Today = getdate()

set @LastYear =  DATEADD(year, -1, @Today)
select @Lastyear

它工作正常,我会得到去年的日期。

但是当我尝试这样的事情时:

declare @Today date  
declare @LastYear date

declare @Timeresolution varchar(5) 
select @Timeresolution =  [Timeresolution] from dbo.mytable where rule_id=1//Timeresolution is a varchar column in my table holding the values 'year' or 'month'

declare Iteration int 
select @Iteration  =  [Iteration] from dbo.mytable where rule_id=1 //Iteration is a int column in my table holding the values  1 or 2, or 3

set @Today = getdate()

set @LastYear =  DATEADD(Timeresolution , -Iteration , @Today) 

select @Lastyear

这给了我一个转换错误。

有没有办法创建这样的动态日期表达式?

【问题讨论】:

    标签: sql-server tsql date stored-procedures


    【解决方案1】:

    无法在 DATEADD 中使用变量作为间隔,但您可以执行以下操作:

    IF @Timeresolution = 'year'
    BEGIN
        SET @LastYear =  DATEADD(year, -@Iteration , @Today) 
    END
    
    IF @Timeresolution = 'month'
    BEGIN
        SET @LastYear =  DATEADD(month, -@Iteration , @Today) 
    END
    

    【讨论】:

    • 谢谢,但是。我试图避免这种 if/case 条件,因为最终可能会有更多变量选项。
    猜你喜欢
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    相关资源
    最近更新 更多