Date.AddDays/Months/Quarters/Weeks/Years

官方说明:

通过将numberOfDays天添加到datetime值dateTime,返回date、datetime或datetimezone结果。
dateTime:天数要添加到的date、datetime或datetimezone值。
numberOfDays:要添加的天数。
Date.AddDays( dateTime as any, numberOfDays as number) as any
 

解读:

本文将介绍5个函数,分别为Date.AddDays,Date.AddMonths,Date.AddQuarters,Date.AddWeeks,Date.AddYears,由于语法接近,上方只放了其中一个函数的说明,其他类同。
由于PQ对数据类型的要求严格,导致很多小伙伴按照在excel中的思维,用日期直接加减一个整数,结果报错了:

原因上面说了,就是日期时间类型不能和数值型直接运算,所以要用到本文介绍的几个函数,正确的写法应该是:

第一参数给日期,第二参数给一个整数,可以是正整数,也可以是负整数,也可以是0。如果第二参数为负数,则代表往前推移。但是如果给一个小数,比如1.5,就会报错了。
这是增减天数,其他几个函数也类似,分别为增减月份、季度、星期和年,来看案例:

let
    date = #date(2016,1,31),
    day = Date.AddDays(date,-1),                     //2016/1/30
    month = Date.AddMonths(date,1),                  //2016/2/29
    quarter = Date.AddQuarters(date,1),              //2016/4/30
    week= Date.AddWeeks(date,-2),                    //2016/1/17
    year = Date.AddYears(date,1)                     //2017/1/31
in
    year

可以看到比如1月30日这种,加1月返回2月29日,还是挺智能的。
需要注意的是,虽然函数的类为Date,但如果目标值为DateTime,也同样是可以的。比如= Date.AddDays(#datetime(2017,7,24,1,2,3),1),返回2017/7/25 1:02:03。就是说你给date就返回date,给datetime就返回datetime,不要看到是datetime就以为不行然后用DateTime.AddDays,实际上是没有这个函数的。
 

替代用法:

计算时间推移,尽管提供了这5个函数,但是你会发现有些情况还是用不了,比如往后推移半天即12小时,因为第二参数必须为整数你不可以给0.5。所以可以这样:
= #datetime(2017,7,24,1,2,3)+#duration(0,12,0,0),返回2017/7/24 13:02:03。
其中duration为持续时间,需要4个参数:天、时、分、秒,同样可以为正负整数和0。所以以上5个函数中的AddDays和AddWeeks可以用这种方法替代,且更建议这种方法。一个是因为有四个参数比较灵活,另一个是因为如果使用函数嵌套,括号多了容易分不清,而这种方法就比较清晰。

2 Replies to “Date.AddDays/Months/Quarters/Weeks/Years”

  1. let
    date = #date(2016,2,29),
    day = Date.AddDays(date,-1), //2016/2/28
    month = Date.AddMonths(date,1), //2016/3/29
    quarter = Date.AddQuarters(date,1), //2016/5/29
    week= Date.AddWeeks(date,-2), //2016/2/15,等同于Date.AddDays(,date,-14)
    year = Date.AddYears(date,1) //2017/2/28
    in
    year

    测试起来还是挺有意思的
    另,excel的日期是从1900年1月0日开始的,PQ貌似是从公元元年开始的?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注