如何计算月初月末周一周日、本周范围
基础函数介绍
关于本次公式使用到的几个函数介绍:
1.生成日期
将数字拼接成为日期——DATE(年,月,日,时,分)
2.时间转换
提取日期中的年月日时分秒/判断周几——TEXT(日期,"指定格式")
指定格式有:年 "YYYY" 月 "MM" 日 "DD" 时 "HH" 分 "mm" 秒 "ss"
"E" :表示星期,结果为06,分别表示星期日星期六
"EE" :表示星期,例如:周日、周一、周二等
"EEE":表示星期,例如:星期日、星期一、星期二等
3.当前时间
精确到秒——NOW()
精确到日——CURDATE()
4.日期加减天数
指定日期,增加或减少指定单位的时间后的日期——DATEDELTA ( 日期 , 数量 , 时间单位 )
数量:需要增加/减少的数量,正数为增加,负数为减少 时间单位:天 "D";月 "M";年 "Y";小时 "H";分钟 "MIN" 不填写时间单位是默认单位为天
5.条件判断
根据判断条件的正确或错误,返回不同的值——IF(判断条件,真值, 假值)
6.日期比较/时间差
计算两个日期字段之间的天数差,可返回负值——DAYS(结束日期,起始日期)
日期比较,通过天数差的正负值比较——DAYS(结束日期,起始日期)>0
注:此方法不可取:结束日期 > 起始日期
本月月初
逻辑:TEXT将日期转换为指定格式的年和月,再使用DATE拼接日期得到月初日期
本月月初=DATE(年,月,日)=DATE(今年,本月,月初1号)
年,即今年=TEXT(当前日期,取年)=TEXT(CURDATE(),"YYYY")
月,即本月=TEXT(当前日期,取月)=TEXT(CURDATE(),"MM")
日,即月初1号="01"
本月月初=DATE(TEXT(CURDATE(),"YYYY"),TEXT(CURDATE(),"MM"),"01")
如需指定日期,可将"CURDATE()"更换为日期字段.
本月月末
逻辑:用DATEDELTA将日期增加一个月,TEXT将日期转换为指定格式的年和月,再使用DATE拼接日期得到第二个月的月初日期,最后用DATEDELTA将日期减去一天
本月月末=DATEDELTA (日期字段,数量,时间单位)=DATEDELTA (下月月初, 减少1天)
下月月初=DATE(年,月,日)=DATE(下月年份,下月月份,月初1号)
下月,即当前日期+1个月=DATEDELTA(当前日期,1,"M")=DATEDELTA(CURDATE(),1,"M")
下月年份=TEXT(下月,取年)=TEXT(DATEDELTA(CURDATE(),1,"M"),"YYYY")
下月月份=TEXT(下月,取月)=TEXT(DATEDELTA(CURDATE(),1,"M"),"MM")
月初1号="01"
下月月初=DATE(TEXT(DATEDELTA(CURDATE(),1,"M"),"YYYY"),TEXT(DATEDELTA(CURDATE(),1,"M"),"MM"),"01")
本月月末=DATEDELTA(DATE(TEXT(DATEDELTA(CURDATE(),1,"M"),"YYYY"),TEXT(DATEDELTA(CURDATE(),1,"M"),"MM"),"01"),-1)
如需指定日期,可将"CURDATE()"更换为日期字段.
下月月初
逻辑:用DATEDELTA将日期增加一个月,TEXT将日期转换为指定格式的年和月,再使用DATE拼接日期得到第二个月的月初日期
下月月初=DATE(年,月,日)=DATE(下月年份,下月月份,月初1号)
下月,即当前日期+1个月=DATEDELTA(当前日期,1,"M")=DATEDELTA(CURDATE(),1,"M")
下月年份=TEXT(下月,取年)=TEXT(DATEDELTA(CURDATE(),1,"M"),"YYYY")
下月月份=TEXT(下月,取月)=TEXT(DATEDELTA(CURDATE(),1,"M"),"MM")
月初1号="01"
下月月初=DATE(TEXT(DATEDELTA(CURDATE(),1,"M"),"YYYY"),TEXT(DATEDELTA(CURDATE(),1,"M"),"MM"),"01")
如需指定日期,可将"CURDATE()"更换为日期字段.
下月月末
逻辑:用DATEDELTA将日期增加两个月,TEXT将日期转换为指定格式的年和月,再使用DATE拼接日期得到第二个月的月初日期,最后用DATEDELTA将日期减去一天
本月月末=DATEDELTA (日期字段,数量,时间单位)=DATEDELTA (下下月月初, 减少1天)
下下月月初=DATE(年,月,日)=DATE(下下月年份,下下月月份,月初1号)
下下月,即当前日期+2个月=DATEDELTA(当前日期,2,"M")=DATEDELTA(CURDATE(),2,"M")
下下月年份=TEXT(下下月,取年)=TEXT(DATEDELTA(CURDATE(),2,"M"),"YYYY")
下下月月份=TEXT(下下月,取月)=TEXT(DATEDELTA(CURDATE(),2,"M"),"MM")
月初1号="01"
下下月月初=DATE(TEXT(DATEDELTA(CURDATE(),2,"M"),"YYYY"),TEXT(DATEDELTA(CURDATE(),2,"M"),"MM"),"01")
下月月末=DATEDELTA(DATE(TEXT(DATEDELTA(CURDATE(),2,"M"),"YYYY"),TEXT(DATEDELTA(CURDATE(),2,"M"),"MM"),"01"),-1)
如需指定日期,可将"CURDATE()"更换为日期字段.
本周周一
逻辑:使用TEXT判断周几,在用DATEDELTA减去对应的天数。除了周日,其他都可以遵循一定的规律。
TEXT(日期,"E") 本周周一 ⚠️ "E" :表示星期,结果为06,分别表示星期日星期六
周日,0 减去6天 = -6 即 -6
周一,1 减去0天 = -1+1 即 -NUM(TEXT(日期,"E")+1
周二,2 减去1天 = -2+1 即 -NUM(TEXT(日期,"E")+1
周三,3 减去2天 = -3+1 即 -NUM(TEXT(日期,"E")+1
周四,4 减去3天 = -4+1 即 -NUM(TEXT(日期,"E")+1
周五,5 减去4天 = -5+1 即 -NUM(TEXT(日期,"E")+1
周六,6 减去5天 = -6+1 即 -NUM(TEXT(日期,"E")+1
IF(判断条件,真值, 假值)
判断条件:非周日,即 NUM(TEXT(CURDATE(),"E"))!=0
真值:如果是周一至周六,计算周一时,减去的天数可表示为:-NUM(TEXT(日期,"E")+1
即 DATEDELTA(当前日期, (-NUM(TEXT(当前日期,"E"))+1), "D")
假值:如果是周日,计算周一时,减去的天数可表示为:-6
即 DATEDELTA(当前日期, -6, "D")
本周周一 = IF(非周日, 减去指定规律的天数, 减去固定的6天)
**=**IF(NUM(TEXT(CURDATE(),"E"))!=0,DATEDELTA(CURDATE(),(-NUM(TEXT(CURDATE(),"E"))+1),"D"),DATEDELTA(CURDATE(),-6,"D"))
如需指定日期,可将"CURDATE()"更换为日期字段.
本周周日
逻辑:使用TEXT判断周几,在用DATEDELTA加上对应的天数。除了周日,其他都可以遵循一定的规律。
TEXT(日期,"E") 本周周日 ⚠️ "E" :表示星期,结果为06,分别表示星期日星期六
周日,0 当天 CURDATE()
周一,1 加上6天 = -1+7 即 -NUM(TEXT(日期,"E")+7
周二,2 加上5天 = -2+7 即 -NUM(TEXT(日期,"E")+7
周三,3 加上4天 = -3+7 即 -NUM(TEXT(日期,"E")+7
周四,4 加上3天 = -4+7 即 -NUM(TEXT(日期,"E")+7
周五,5 加上2天 = -5+7 即 -NUM(TEXT(日期,"E")+7
周六,6 加上1天 = -6+7 即 -NUM(TEXT(日期,"E")+7
IF(判断条件,真值, 假值)
判断条件:非周日,即 NUM(TEXT(CURDATE(),"E"))!=0
真值:如果是周一至周六,计算周日时,加上的天数可表示为:-NUM(TEXT(日期,"E")+7
即 DATEDELTA(当前日期, (-NUM(TEXT(当前日期,"E"))+7), "D")
假值:如果是周日,即周日当天
即 CURDATE()
本周周日 = IF(非周日, 加上指定规律的天数, 当前日期)
=IF(NUM(TEXT(CURDATE(),"E"))!=0,DATEDELTA(CURDATE(),(-NUM(TEXT(CURDATE(),"E"))+7),"D"),CURDATE())
如需指定日期,可将"CURDATE()"更换为日期字段.
上周周一
逻辑:使用TEXT判断周几,在用DATEDELTA减去对应的天数。除了周日,其他都可以遵循一定的规律。
TEXT(日期,"E") 上周周一 ⚠️ "E" :表示星期,结果为06,分别表示星期日星期六
周日,0 减去13天 即 -13
周一,1 减去7天 = -1-6 即 -NUM(TEXT(日期,"E")-6
周二,2 减去8天 = -2-6 即 -NUM(TEXT(日期,"E")-6
周三,3 减去9天 = -3-6 即 -NUM(TEXT(日期,"E")-6
周四,4 减去10天= -4-6 即 -NUM(TEXT(日期,"E")-6
周五,5 减去11天= -5-6 即 -NUM(TEXT(日期,"E")-6
周六,6 减去12天= -6-6 即 -NUM(TEXT(日期,"E")-6
IF(判断条件,真值, 假值)
判断条件:非周日,即 NUM(TEXT(CURDATE(),"E"))!=0
真值:如果是周一至周六,计算上周一时,减去的天数可表示为:-NUM(TEXT(日期,"E")-6
即 DATEDELTA(当前日期, (-NUM(TEXT(当前日期,"E"))-6), "D")
假值:如果是周日,计算上周一时,减去的天数可表示为:-13
即 DATEDELTA(当前日期, -13, "D")
上周周一 = IF(非周日, 减去指定规律的天数, 减去固定的13天)
**=**IF(NUM(TEXT(CURDATE(),"E"))!=0,DATEDELTA(CURDATE(),(-NUM(TEXT(CURDATE(),"E"))-6),"D"),DATEDELTA(CURDATE(),-13,"D"))
如需指定日期,可将"CURDATE()"更换为日期字段.
上周周日
逻辑:使用TEXT判断周几,在用DATEDELTA减去对应的天数。除了周日,其他都可以遵循一定的规律。
TEXT(日期,"E") 上周周日 ⚠️ "E" :表示星期,结果为06,分别表示星期日星期六
周日,0 减去7天 即 -7
周一,1 减去1天 = -1 即 -NUM(TEXT(日期,"E")
周二,2 减去2天 = -2 即 -NUM(TEXT(日期,"E")
周三,3 减去3天 = -3 即 -NUM(TEXT(日期,"E")
周四,4 减去4天 = -4 即 -NUM(TEXT(日期,"E")
周五,5 减去5天 = -5 即 -NUM(TEXT(日期,"E")
周六,6 减去6天 = -6 即 -NUM(TEXT(日期,"E")
IF(判断条件,真值, 假值)
判断条件:非周日,即 NUM(TEXT(CURDATE(),"E"))!=0
真值:如果是周一至周六,计算上周日时,减去的天数可表示为:-NUM(TEXT(日期,"E")
即 DATEDELTA(当前日期, -NUM(TEXT(当前日期,"E")), "D")
假值:如果是周日,计算上周日时,减去的天数可表示为:-7
即 DATEDELTA(当前日期, -7, "D")
上周周日 = IF(非周日, 减去指定规律的天数, 减去固定的7天)
=IF(NUM(TEXT(CURDATE(),"E"))!=0,DATEDELTA(CURDATE(),-NUM(TEXT(CURDATE(),"E")),"D"),DATEDELTA(CURDATE(), -7, "D"))
如需指定日期,可将"CURDATE()"更换为日期字段.
动态范围:本周(周一开始)
需求场景
我们的数据/报表/门户,数据筛选条件,动态范围“本周”,开始时间都是从上周日到本周六。
但是按照中国人的习惯,一般是从本周一到本周日。

高级模式筛选(可用于字段/视图/报表等,不支持门户)
逻辑
本周周一 <= 申请日期 <= 本周周日 (注:此为思路,实际公式不支持该形式)
在轻流中可以这样表示:
条件1:DAYS(申请日期,本周周一) >= 0
条件2:DAYS(申请日期,本周周日) <= 0
同时满足条件1和条件2:AND(条件1, 条件2)
即 AND(DAYS(申请日期,本周周一) >= 0, DAYS(申请日期,本周周日) <= 0)
将上述求得的本周周一和本周周日公式套入即可。
公式复制
AND(DAYS(申请日期,IF(NUM(TEXT(CURDATE(),"E"))!=0,DATEDELTA(CURDATE(),(-NUM(TEXT(CURDATE(),"E"))+1),"D"),DATEDELTA(CURDATE(),-6,"D")))>=0,DAYS(申请日期,IF(NUM(TEXT(CURDATE(),"E"))!=0,DATEDELTA(CURDATE(),(-NUM(TEXT(CURDATE(),"E"))+7),"D"),CURDATE()))<=0)
绿框内“申请日期”请手动替换为应用内日期字段
实现效果

动态范围:上周(上周一开始)
需求场景
我们的数据/报表/门户,数据筛选条件,动态范围“上周”,开始时间都是从上上周日到上周六。
但是按照中国人的习惯,一般是从上周一到上周日。

高级模式筛选(可用于字段/视图/报表等,不支持门户)
逻辑
上周周一 <= 申请日期 <= 上周周日 (注:此为思路,实际公式不支持该形式)
在轻流中可以这样表示:
条件1:DAYS(申请日期,上周周一) >= 0
条件2:DAYS(申请日期,上周周日) <= 0
同时满足条件1和条件2:AND(条件1, 条件2)
即 AND(DAYS(申请日期,上周周一) >= 0, DAYS(申请日期,上周周日) <= 0)
将上述求得的上周周一和上周周日公式套入即可。
公式复制
AND(DAYS(申请日期,IF(NUM(TEXT(CURDATE(),"E"))!=0,DATEDELTA(CURDATE(),(-NUM(TEXT(CURDATE(),"E"))-6),"D"),DATEDELTA(CURDATE(),-13,"D")))>=0,DAYS(申请日期,IF(NUM(TEXT(CURDATE(),"E"))!=0,DATEDELTA(CURDATE(),-NUM(TEXT(CURDATE(),"E")),"D"),DATEDELTA(CURDATE(), -7, "D")))<=0)
绿框内“申请日期”请手动替换为应用内日期字段
实现效果

动态范围:下月
需求场景
通过高级模式筛选,获得动态范围“下月”的数据,开始时间都是从下月月初到下月月末。
高级模式筛选(可用于字段/视图/报表等,不支持门户)
逻辑
下月月初 <= 日期字段 <= 下月月末 (注:此为思路,实际公式不支持该形式)
在轻流中可以这样表示:
条件1:DAYS(日期字段,下月月初) >= 0
条件2:DAYS(日期字段,下月月末) <= 0
同时满足条件1和条件2:AND(条件1, 条件2)
即 AND(DAYS(日期字段,下月月初) >= 0, DAYS(日期字段,下月月末) <= 0)
将上述求得的下月月初和下月月末公式套入即可。
公式复制
AND(DAYS(日期字段,DATE(TEXT(DATEDELTA(CURDATE(),1,"M"),"YYYY"),TEXT(DATEDELTA(CURDATE(),1,"M"),"MM"),"01"))>=0,DAYS(日期字段,DATEDELTA(DATE(TEXT(DATEDELTA(CURDATE(),2,"M"),"YYYY"),TEXT(DATEDELTA(CURDATE(),2,"M"),"MM"),"01"),-1))<=0)
绿框内“日期字段”请手动替换为应用内日期字段
实现效果
