【问题标题】:Month Offset in BO 4.0 (IDT)BO 4.0 (IDT) 中的月份偏移量
【发布时间】:2015-05-02 17:14:56
【问题描述】:

我想参考当前日期制作一个月的偏移量(我正在使用 BusinessObjects 4.0 信息设计工具)。 例如,有一列值为 201505(表示 2015 年 5 月),新列的值应为“2”(假设当前月份为 201503 - 2015 年 3 月)。 另一个例子,如果第一列的值是“201410”,那么新列的值应该是“-7”。

我尝试通过分析'Current Month Num - 12'列来实现'month offset'列,定义如下:

cast(
convert(
    char(6), 
    dateadd(m, -12,
                left(cast(( Zeitdimension.Year_Month_NUM ) as char(6)), 4) 
                + '-' 
                + right(cast(( Zeitdimension.Year_Month_NUM ) as char(6)), 2)
                + '-01')
    , 112
) 
as int
)

(Zeitdimension.Year_Month_NUM 有201402、201901...等值)

但是我不了解 convert 和 dateadd 函数,也无法在 Internet 上找到有关它们的任何信息。

我的想法是通过获取第一列中的值(值为 201401、201502)并从当前日期中减去这些值(例如 201501、 201403...)。

谁能帮我解决以下问题:

  1. 解释convert、dateadd函数以及上面的表达式
  2. 帮我定义“月份偏移”列

谢谢!

【问题讨论】:

    标签: sql-server business-objects


    【解决方案1】:

    函数convertdateadd 是SQL Server 函数,而不是BusinessObject 函数。您可以在 Transact-SQL 参考 > 内置函数部分的Books Online 文档中获得更多信息。

    关于现有表达式:最内层分解现有列值并将其转换为日期,例如2014122014-12-01

    left(cast(( Zeitdimension.Year_Month_NUM ) as char(6)), 4) 
    + '-' 
    + right(cast(( Zeitdimension.Year_Month_NUM ) as char(6)), 2)
    + '-01')
    

    dateadd 函数然后减去 12 个月。 convert 将日期更改为字符串(格式为YYYYMMDD)并去掉最后两位数字,从而生成201312

    最后,cast将数据类型从字符串更改为整数。

    您不能开始使用结果值进行计算(例如,从 201501 中减去 201401,因为这不会考虑到您正在处理年和月)。后一个示例将返回 100 而不是 12

    相反,要计算与当前日期相比的月数偏移量,请尝试以下表达式:

    datediff(mm
            ,dateadd(d, datepart(d, getdate()) * -1, getdate())
            ,left(cast(( Zeitdimension.Year_Month_NUM ) as char(6)), 4) 
            + '-' 
            + right(cast(( Zeitdimension.Year_Month_NUM ) as char(6)), 2)
            + '-01')
    

    这将取当前日期,减去当前天数(因此您总是在该月的第一个日期结束),然后使用 datediff 计算月数差。

    在最新的 SQL Server 版本中,可用的日期时间函数得到了显着改进,无需执行此类复杂的转换。同样,请查看联机丛书,了解您正在使用的 SQL Server 版本中的可用内容。

    【讨论】:

    • 感谢您的评论。尝试中的解决方案无法正常工作。例如,当我在第一列中有 201601 时,当我计算“Month Current Offest Num”时,我得到的值是“98”......你能为我的问题提出解决方案吗?
    • 好像没问题。但是,有1个月的差异。例如,参考“201502”值,表达式的结果是“0”,而不是我预期的“-1”(再次参考当前月份年份 201503)。我该如何适应?
    • 我手头没有 sql server 环境来测试它。鉴于 Books Online 链接和提供的信息,稍加努力,您应该能够弄清楚。
    • 认为我想通了 -> 通过将 'dateadd(d, datepart(d, getdate()) * -1, getdate())' 更改为 'dateadd(d, datepart(d, getdate ()) * -1 +1, getdate())',我得到了预期的结果。非常感谢您的帮助! :)
    猜你喜欢
    • 1970-01-01
    • 2021-08-08
    • 2021-06-22
    • 2017-02-11
    • 2014-07-01
    • 2022-01-21
    • 1970-01-01
    • 2018-11-15
    • 2019-07-27
    相关资源
    最近更新 更多