DATEADD

适用于:计算列计算表度量值视觉计算

注意

不建议将此函数用于 视觉计算,因为它可能会返回毫无意义的结果。

如果输入是日期列,则返回一个表,该表包含日期列,按当前上下文中日期的指定间隔数向前或向后移动。
如果输入是日历,则函数根据当前上下文返回按指定间隔数向前或向后移动的日期。 输出包括主要标记列以及与时间相关的列。

语法

DATEADD(<dates> or <calendar>, <number_of_intervals>, <interval>[,<Extension>],[,<Truncation>])

参数

术语 定义
dates or calendar 包含日期或日历引用的列。
number_of_intervals 一个整数,指定要在日期中添加或减去的间隔数。
interval 要移动日期的间隔。 间隔的值可以是下列值之一:year、、quarterweekmonthday。 仅当提供日历引用时,星期枚举才适用。
extension 仅当提供日历引用时适用。 定义原始时间段的日期少于生成的时间段时的行为。 有效值为:扩展(默认值),PRECISE。
truncation 仅当提供日历引用时适用。 定义原始时间段的日期多于生成的时间段时的行为。 有效值为:BLANKS (默认值),锚定。

返回值

对于日期列输入,包含单个日期值的列的表。
对于日历输入,一个表,其中包含当前上下文中移位期间的所有主标记列和时间相关列。

言论

dates 参数可以是以下任一参数:

  • 对日期/时间列的引用,

  • 返回日期/时间值的单个列的表表达式,

  • 一个布尔表达式,用于定义日期/时间值的单列表。

    注意

    本主题介绍了对布尔表达式的约束,CALCULATE 函数

  • 如果为 number_of_intervals 指定的数字为正数,则 dates 中的日期按时间向前移动;如果数字为负数,则 dates 中的日期将及时移回。

  • interval 参数是一个枚举,而不是一组字符串;因此不应将值括在引号中。 此外,值:yearquartermonthday 在使用它们时应完全拼写。

  • 结果表仅包含 dates 列中存在的日期。

  • 如果使用日期列语法,并且当前上下文中的日期不构成连续的间隔,则函数将返回错误。

  • 在计算列或行级别安全性 (RLS) 规则中使用时,不支持在 DirectQuery 模式下使用此函数。

示例 - 移动一组日期

以下公式计算当前上下文中日期之前的一年日期。

= DATEADD ( DateTime[DateKey], -1, YEAR )

基于日历的时间智能示例

以下公式返回从当前上下文中的日期移回一年的日期表。

DATEADD ( FiscalCalendar, -1, YEAR )

输入为日期列时的特殊行为

当所选内容包括过去两天的月份时, DATEADD 将使用“扩展”语义,并将包含到月底的天数。 例如,当 2013 年 2 月 27 日和 28 日包含在所选内容中并添加一个月时,DATEADD 将返回 3 月 27 日至 31 日。

仅当选定内容包含过去两天的月份时,才会发生此行为。 如果仅选择了 2 月 27 日,它将转到 3 月 27 日。

= DATEADD(DateTime[DateKey], 1, month)

基于日历的时间智能通过两个可选参数提供更多控制:“扩展”和“截断”。 有关详细信息,请参阅上述参数说明。

当所选内容比 Shift 级别更精细时,基于日历的 DateAdd 的行为

使用日历引用并且选择的粒度比移位级别更精细时,会采用基于索引的方法。 为了说明此行为,我们来考虑选择处于日期级别且 DATEADD() 按月移动的情况。 以下是 DateAdd 将执行的作:

  • 确定月份中当前所选内容的位置。
    例如,如果当前所选内容跨越 3 月 3 日至 10 日,则位置从月份的第 3 天到第 10 天。

  • 轮班月份应用月班次,例如 3 月到 4 月的 1 次换班。

  • 返回新月的第 3 个到新月 10 日的同一相对位置(例如 4 月 3 日至 10 日)。

当所选内容比 Shift 级别更精细时,基于日历的 DateAdd 的参数

当选择粒度比换班单位(例如,按月移动时选择单个日期) 更精细 时, 基于索引的行为 可能会导致 歧义,尤其是在长度不同的月份中。 为了处理这些边缘情况,引入了两个参数:

扩展参数(对于小型→大月班次):

控制当目标 月份长于 当前月份时函数的行为方式。

  • Precise:严格保留原始日期范围。
    Feb 25–28March 25–28

  • Extending:允许窗口根据需要扩展到 月底
    Feb 25–28March 25–31

截断参数(对于大型→小月班)

控制当目标月份比当前月份 时函数的行为方式。

  • Anchored:将结果定位到较小的月份 的最后一个有效日期
    March 31Feb 28

  • Blanks:当移位日期不存在时返回 空白
    March 31 →→ (空白) (自 2 月以来没有 31 日)

经典时间智能和日历时间智能之间的行为差异

某些方案在比较经典和日历时间智能时可能会产生不同的结果。 例如,在农历年份中,SamePeriodLastYear 将在日期粒度上产生不同的结果。 在基于日历的时间智能中,2008年2月29日改回一年的结果是2007年3月1日,因为它被视为今年的第60天。 在经典时间智能中,同一班次返回 2007 年 2 月 28 日。 解决方法是使用 DATEADD(日历, -<年>、月数)。 例如,如果一年在日历中具有 13 个月,请使用 DATEADD(Calendar, -13, month)。 这种方法将逐月转移,因此 2008 年 2 月将转到 2007 年 2 月。

时间智能函数日期和时间函数