注意
不建议将此函数用于 视觉计算,因为它可能会返回毫无意义的结果。
如果输入是日期列,则返回一个表,该表包含日期列,按当前上下文中日期的指定间隔数向前或向后移动。
如果输入是日历,则函数根据当前上下文返回按指定间隔数向前或向后移动的日期。 输出包括主要标记列以及与时间相关的列。
语法
DATEADD(<dates> or <calendar>, <number_of_intervals>, <interval>[,<Extension>],[,<Truncation>])
参数
| 术语 | 定义 |
|---|---|
dates or calendar |
包含日期或日历引用的列。 |
number_of_intervals |
一个整数,指定要在日期中添加或减去的间隔数。 |
interval |
要移动日期的间隔。 间隔的值可以是下列值之一:year、、quarter、weekmonthday。 仅当提供日历引用时,星期枚举才适用。 |
extension |
仅当提供日历引用时适用。 定义原始时间段的日期少于生成的时间段时的行为。 有效值为:扩展(默认值),PRECISE。 |
truncation |
仅当提供日历引用时适用。 定义原始时间段的日期多于生成的时间段时的行为。 有效值为:BLANKS (默认值),锚定。 |
返回值
对于日期列输入,包含单个日期值的列的表。
对于日历输入,一个表,其中包含当前上下文中移位期间的所有主标记列和时间相关列。
言论
dates 参数可以是以下任一参数:
对日期/时间列的引用,
返回日期/时间值的单个列的表表达式,
一个布尔表达式,用于定义日期/时间值的单列表。
注意
本主题介绍了对布尔表达式的约束,CALCULATE 函数。
如果为
number_of_intervals指定的数字为正数,则dates中的日期按时间向前移动;如果数字为负数,则dates中的日期将及时移回。interval参数是一个枚举,而不是一组字符串;因此不应将值括在引号中。 此外,值:year、quarter、month、day在使用它们时应完全拼写。结果表仅包含
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–28→March 25–28Extending:允许窗口根据需要扩展到 月底 。
→Feb 25–28→March 25–31
截断参数(对于大型→小月班)
控制当目标月份比当前月份 短 时函数的行为方式。
Anchored:将结果定位到较小的月份 的最后一个有效日期 。
→March 31→Feb 28Blanks:当移位日期不存在时返回 空白 。
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 月。