1. 概述
注:一些常用的日期函数写法详情参见 常见日期函数 。
1.1 版本
FineReport 版本 | 功能变动 |
---|---|
11.0 | - |
11.0.4 | 新增 ENDOFMONTH、ISWORKDAY 函数 |
1.2 应用场景
日期函数允许对数据源中的日期进行操作。
可能有一个各个值为年、月、日的日期字段 (2004-04-15),可以使用日期函数(例如 DATEINMONTH 函数)依据这些现有值创建新的日期值。
例如,可以查找任何现有日期值的「当月第一天」。
在单元格中输入:=DATEINMONTH("2004-04-15",1),如下图所示:
如果原始日期为「2004-04-15」,则使用上面的计算会返回「2004-04-01」,即当前时间对应月份的第一天,如下图所示:
1.3 注意事项
函数中以日期作为参数因子的,其中日期的形式都必须是 yyyy/mm/dd,而且必须用英文环境下双引号(" ")引用。
若日期函数不合法,则会用当前时间进行计算。
若在文本控件中使用日期函数显示 yyyy/mm/dd 格式,需使用 Format 函数 进行转换。
2. DATE-某一特定日期
DATE(year,month,day):返回一个表示某一特定日期的系列数。
Year:代表年,可为一到四位数。
Month:代表月份。
若 1<=month<= 12,则函数把参数值作为月。
若 month>12,则函数从年的一月份开始往上累加。例如:DATE(2000,25,2) 等于 2002 年 1 月 2 日的系列数。
Day:代表日。
若日期小于等于某指定月的天数,则函数将此参数值作为日。
若日期大于某指定月的天数,则函数从指定月份的第一天开始往上累加。若日期大于两个或多个月的总天数,则函数把减去两个月或多个月的余数加到第三或第四个月上,依此类推。
如:DATE(2000,3,35)等于 2000 年 4 月 4 日的系列数。
示例:
DATE(1978, 9, 19)等于 1978 年 9 月 19 日。
DATE(1211, 12, 1)等于 1211 年 12 月 1 日。
其中月和日为 1 到 9 之间的数字时,不需要在前面加上 0 而直接写数字如 DATE(2011, 2, 1)即可。
3. DATEDELTA-某日期后几天
DATEDELTA(date, deltadays):返回一个日期——date 后 deltadays 的日期。deltaDays 可以为正值,负值,零。
示例:
DATEDELTA("2008-08-08", -10)等于 2008-07-29。
DATEDELTA("2008-08-08", 10)等于 2008-08-18。
4. DATEDIF-时间差天数
1)概述
语法 | DATEDIF(start_date,end_date,unit,method) | 返回两个指定日期间的天数、月数或年数。 |
---|---|---|
参数1 | Start_date | 代表所指定时间段的初始日期 |
参数2 | End_date | 代表所指定时间段的终止日期 |
参数3 | Unit | 函数返回信息的类型 |
参数4 | method | 可选参数,默认返回日期差值的绝对值 |
2)注意事项
若unit="Y",则DATEDIF返回指定时间段的年差数。
若unit="M",则DATEDIF返回指定时间段的月差数。
若unit="D",则DATEDIF返回指定时间段的日差数。
若unit="MD",则DATEDIF忽略年和月,返回指定时间段的日差数。
若unit="YM",则DATEDIF忽略年和日,返回指定时间段的月差数。
若unit="YD",则DATEDIF忽略年,返回指定时间段的日差数。
若method=1,则DATEDIF返回日期差值的绝对值。
若method=-1,则DATEDIF返回日期差值时,会考虑正负情况。
3)示例
DATEDIF("2001/2/28","2004/3/20","Y") 等于 3,即在 2001 年 2 月 28 日与 2004 年 3 月 20 日之间有 3 个整年。
DATEDIF("2001/2/28","2004/3/20","M") 等于 36,即在 2001 年 2 月 28 日与 2004 年 3 月 20 日之间有 36 个整月。
DATEDIF("2001/2/28","2004/3/20","D") 等于 1116,即在 2001 年 2 月 28 日与 2004 年 3 月 20 日之间有 1116 个整天。
DATEDIF("2001/2/28","2004/3/20","MD") 等于 8,即忽略月和年后,2001 年 2 月 28 日与 2004 年 3 月 20 日的差为 8 天。
DATEDIF("2001/1/28","2004/3/20","YM") 等于 2,即忽略日和年后,2001 年 1 月 28 日与 2004 年 3 月 20 日的差为 2 个月。
DATEDIF("2001/2/28","2004/3/20","YD") 等于 21,即忽略年后,2001 年 2 月 28 日与 2004 年 3 月 20 日的差为 21 天。
4. DATEINMONTH
DATEINMONTH(date, number):函数返回在某一个月当中第几天的日期。
示例:
DATEINMONTH("2008-08-08", 20) 等于 2008-08-20。
5. DATEINQUARTER-某一个季度当中第几天的日期
DATEINQUARTER(date, number):函数返回在某一个季度当中第几天的日期。
示例:
DATEINQUARTER("2009-05-05", 20) 等于 2009-04-20。
6. DATEINWEEK
DATEINWEEK(date, number):函数返回在某一个星期当中第几天的日期。
示例:
dateInWeek("2008-08-28", 2)等于 2008-08-26。
7. DATEINYEAR
DATEINYEAR(date, number):函数返回在某一年当中第几天的日期。
示例:
DATEINYEAR("2008/12/03", 300)等于 2008-10-26。
8. DATESUBDATE-两个日期之间的时间差
1)概述
语法 | DATESUBDATE(date1, date2, op) | 返回两个日期之间的时间差 |
---|---|---|
参数1 | date1 | 代表所指定时间段的初始日期 |
参数2 | date2 | 代表所指定时间段的终止日期 |
参数3 | op | 表示返回的时间单位 "s",以秒为单位。 "m",以分钟为单位。 "h",以小时为单位。 "d",以天为单位。 "w",以周为单位。 |
2)注意事项
计算结果默认为 date1-date2 ,会考虑正负情况。
3)示例
DATESUBDATE("2008-08-08", "2008-06-06","h") 等于 1512。
9. DATETONUMBER
DATETONUMBER(date):返回自 1970 年 1月 1日 08:00:00 GMT 经过的毫秒数。
示例:
DATETONUMBER("2008-08-08") 等于 1218124800000。
10. DAY
DAY(serial_number):返回日期中的日。DAY 是介于 1 和 31 之间的一个数。
Serial_number:含有所求的年的日期,参数为空时默认为当天日期。
注: FineReport 将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。
在 1900 年日期系统中,FineReport 电子表格将 1900 年 1 月 1 日保存为系列数 2,将 1900 年 1 月 2 日保存为系列数 3,将 1900 年 1 月 3 日保存为系列数 4……依此类推。如在1900 年日期系统,1998 年 1 月 1 日存为系列数 35796。
示例:
DAY("2000/1/1") 等于 1。
DAY("2006/05/05") 等于 5。
DAY("1997/04/20") 等于 20。
DAY(35796) 等于1。
11. DAYS360
DAYS360(start_date,end_date,method):按照一年 360 天的算法(每个月以 30 天计,一年共计 12 个月),返回两日期间相差的天数,这在会计计算中将会用到的。如果财务系统是基于一年 12 个月,每月 30 天,可用此函数帮助计算支付款项。
Start_date 和 end_date :是用于计算期间天数的起止日期。
Method:它指定了在计算中是采用欧洲方法还是美国方法。
Method 定义:FALSE 或忽略 美国方法 (NASD)。如果起始日期是一个月的 31 号,则等于同月的 30 号。如果终止日期是一个月的 31 号,并且起始日期早于 30 号,则终止日期等于下一个月的 1 号,否则,终止日期等于本月的 30 号。
TRUE 欧洲方法。无论是起始日期还是终止日期为一个月的 31号,都将等于本月的 30号。
注: FineReport 将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。
在 1900 年日期系统中,FineReport 电子表格将 1900 年 1 月 1 日保存为系列数 2,将 1900 年 1 月 2 日保存为系列数 3,将 1900 年 1 月 3 日保存为系列数 4……依此类推。如在1900 年日期系统,1998 年 1 月 1 日存为系列数 35796。
示例:
DAYS360("1998/1/30", "1998/2/1") 等于 1
12. DAYSOFMONTH
DAYSOFMONTH(date):返回从 1900 年 1 月后某年某月包含的天数。
示例:
DAYSOFMONTH("1900-02-01") 等于 28
DAYSOFMONTH("2008/04/04") 等于 30
13. DAYSOFQUARTER
DAYSOFQUARTER(date):返回从 1900 年 1 月后某年某季度的天数。
示例:
DAYSOFQUARTER("2009-02-01") 等于 90
DAYSOFQUARTER("2009/05/05") 等于 91
14. DAYSOFYEAR
DAYSOFYEAR(year):返回 1900 年以后某年包含的天数。
示例:
DAYSOFYEAR(2008) 等于 366
15. DAYVALUE
DAYVALUE(date):此函数可用来把一个日期转化为一个系列数,返回值为一个数字。
转化原理:1900 年 1 月 1 日至 date 日期所经历的天数,一个日期匹配一个系列数,方便用户对日期进行数值式计算。
参数 | 含义 | 参数格式 |
---|---|---|
date | 需要转化的日期 | 日期格式或代表日期的文本格式,例如“2000/2/28” 数字格式:整数,例如 1000001 |
date 为整数时,date 大于1000000,认为是 unix 时间;date 小于或等于1000000,认为是距 1900 年 1 月 1 日的天数。unix 时间是指从 1970 年 1 月 1 日 开始所经过的秒数,不考虑闰秒。
示例:
DAYVALUE("2000/1/1") 等于 36525。
DAYVALUE( 1000001) 等于 25568 。
注:如果 date 参数格式不规范,则返回1900年 1 月 1 日至当前日期所经历的天数。
例如:若今天为 2020/09/01,DAYVALUE("2008/02/") 等于 44074,DAYVALUE("0.877766")等于 44074
16. HOUR
HOUR(serial_number):返回某一指定时间的小时数。函数指定 HOUR 为 0(0:00)到 23(23:00)之间的一个整数。
Serial_number:包含所求小时的时间。
示例:
HOUR("11:32:40") 等于 11。
17. MINUTE
MINUTE(serial_number):返回某一指定时间的分钟数,其值是介于 0 与 59 之间的一个整数。
Serial_number:包含所求分钟数的时间。
示例:
MINUTE("15:36:25") 等于 36。
18. MONTH
MONTH(serial_number):返回日期中的月,月是介于 1 和 12 之间的一个数。
Serial_number:含有所求的月的日期,参数为空时默认为当天日期。
注: FineReport 将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。
在 1900 年日期系统中,FineReport 电子表格将 1900 年 1 月 1 日保存为系列数 2,将 1900 年 1 月 2 日保存为系列数 3, 将 1900 年 1 月 3 日保存为系列数 4……依此类推。
如:在 1900 年日期系统,1998 年 1 月 1 日存为系列数 35796。
示例:
MONTH("2004/5/5") 等于 5。
MONTH(35796) 等于 1。
19. MONTHDELTA
MONTHDELTA(date,delta):返回指定日期 date 后 delta 个月的日期。
示例:
MONTHDELTA("2008-08-08", 4) 等于 2008-12-08。
20. NOW
NOW():获取当前时间。
示例:
如果系统时间是 2017-06-27 14:58:06, 则:
NOW()等于 2017-06-27 14:58:06。
21. SECOND
SECOND(s erial_number):返回某一指定时间的秒数,其值是介于 0 与 59 之间的一个整数。
Serial_number:包含所求秒数的时间。
示例:
SECOND("15:36:25") 等于 25。
SECOND("15:36:25", "HH:mm:ss") 等于 25。
22. TIME
TIME(hour,minute,second):返回指定的日期和时间,日期会随当天的日期改变。时间介于0:00:00 与23:59:59之间。
Hour:介于 0 到 23 之间的数。
Minute:介于 0 到 59 之间的数。
Second:介于 0 到 59 之间的数。
示例:
若当前时间为 2022-06-17 则TIME(14,40,0) 等于 2022-06-17 14:40:00。
23. TODATE-转换为日期类型
1)概述
语法 | TODATE() | 函数可以将各种日期形式的参数转换为日期类型。 |
---|
2)注意事项
格式中月份必须大写 MM,年份小写:yy(如果是用来解析形如“20081230”格式,则可写为yyyyMMdd,其余不可使用yyyy 形式)。天份小写:dd
第二个参数必须与第一个日期格式一致
例如第一个参数为"2007/10/15"格式,那么第二个参数格式需写为 yyyy/MM/dd 格式:即 TODATE("2007/10/15","yyyy/MM/dd")
第一个参数为"2007-10-15"格式,那么第二个参数格式需写为 yyyy-MM-dd 格式:即 TODATE("2007-10-15","yyyy-MM-dd")
因此 todate 与 today 同时使用,第二个参数必须为 yyyy-MM-dd 格式:TODATE(TODAY(),"yyyy-MM-dd")
3)示例
有五种参数的形式,见备注:
公式 | 结果 | 备注 |
---|---|---|
TODATE(DATE(2007,12,12)) | 返回2007年12月12日组成的日期。 | 参数是一个日期型的参数,那么直接将这个参数返回 |
TODATE(1023542354746) | 返回2002年6月8日 | 参数是以从1970年1月1日0时0分0秒开始的毫秒数,返回对应的时间。 注:如果date是数字类型,当date大于1000000时,会被当作是unix时间;当date小于或等于1000000时,会被当作是距1900年1月1日的天数。 |
TODATE("2007/10/15") | 返回2007年10月15日组成的日期 | 参数是日期格式的文本,那么返回这个文本对应的日期。 |
TODATE("1/15/07","MM/dd/yy") | 返回07年1月15日组成的日期。(MM必须是大写)。 | 有两个参数,第一个参数是一个日期格式的文本,第二个参数是用来解析日期的格式。 特别的,"yyyyMMdd"是用来解析形如“20081230”之类的日期格式的。比如TODATE("20110830","yyyyMMdd")返回2011年08月30日组成的日期。 |
TODATE("星期一1/15/07","EEEMM/dd/yy","zh") | 返回07年1月15日组成的日期,使用“zh(中文)”才能够正常解析“星期一”这个字符串。 | 第一个参数是一个日期格式的文本,第二个参数是用来解析日期的格式,第三个参数为解析日期的语言,如:zh(中文),en(英文),其中第三个参数为可选参数,默认使用服务器的语言作为解析日期的语言。 使用“zh(中文)”才能够正常解析“星期一”这个字符串。注:如果EEE 和 MM/dd/yy 不一致, 以 MM/dd/yy 为主。 示例:TODATE("星期三1/15/07","EEEMM/dd/yy","zh")返回07年1月15日组成的日期,实际是星期一,而不是星期三 |
24. TODAY
TODAY():是获取当前的日期。
示例:
如果系统日期是 2011-06-20,则:TODAY() 等于 2011-06-20。
25. WEEKDAY
WEEKDAY(Serial_number):获取日期并返回星期数。返回值为介于 0 到 6 之间的某一整数,分别代表星期中的某一天(从星期日到星期六)。
Serial_number:输入的日期。
注: FineReport 将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。
在 1900 年日期系统中,FineReport 电子表格将 1900 年 1 月 1 日保存为系列数 2,将 1900 年 1 月 2 日保存为系列数 3,将 1900 年 1 月 3 日保存为系列数4……依此类推。
如在 1900 年日期系统,1998 年 1 月 1 日存为系列数 35796 。
示例:
WEEKDAY("2005/9/10")等于 6(星期六)。
WEEKDAY("2005/9/11")等于 0(星期日)。
WEEKDAY(35796)等于 4(星期四)。
注:如下图所示,若公式引用单元格,单元格内容为空时,默认返回当天的星期数。但不建议直接使用公式 WEEKDAY(),可能存在风险。
26. WEEK
1)函数介绍
WEEK(serial_num):返回一个代表一年中的第几周的数字。
Serial_num:输入的日期。
2)函数逻辑
年内第一周开始于第一个星期日所对应的日期,此外周的范围为星期日到星期六。
FineReport 将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。
在 1900 年日期系统中,FineReport 将 1900/1/1 保存为系列数2,将 1900/1/2 保存为系列数 3,……依此类推。如 1998/1/1 存为系列数 35796。
3)示例:
WEEK("2005/1/1") 等于 52(本年第一个星期日前的日期,都算作上一年最后一周的日期)
WEEK("2005/1/6") 等于 1(本年第一个星期日后的日期,从本年开始算起)
WEEK(35796) 等于 52(系列数对应到具体日期,然后转化为第几周)
4)参数修改逻辑
WEEK(serial_num,"F1"):采用 Excel 的逻辑,把年内第一个星期日前的日期算作第一周
WEEK(serial_num,"F7") 或 WEEK(serial_num):采用 FineReport 默认逻辑,年内第一个星期日前的日期算作上一年最后一周的日期,本年第一周开始于第一个星期日
例如:
WEEK("2019/1/5","F1") 等于 1
WEEK("2019/1/5","F7") 等于 52
WEEK("2019/1/6","F1") 等于 2
WEEK("2019/1/6","F7") 等于 1
27. WEEKDATE
WEEKDATE(year,month,weekOfMonth,dayOfWeek):返回指定年月的指定周的周几的具体日期。
1)默认周开始于星期日时,此时系统中周的范围为星期日到星期六。
示例:
WEEKDATE(2009,10,2,1) 返回的是 2009 年的 10 月的第二个周的第一天即星期天的日期,返回的是 2009-10-04;
最后一个参数 dayOfWeek为-1 时,表示这个周的最后一天。
示例:
WEEKDATE(2009,12,1,-1) 返回的是 2009 年的 12 月的第一个周的最后一天即星期六的日期,返回的是 2009-12-05。
2)当设置 周开始于星期一 时,此时系统中周的范围为星期一到星期日。
28. YEAR
YEAR(serial_number):返回日期中的年。Year是介于1900和9999之间的一个数。
Serial_number:含有所求的年的日期,参数为空时默认为当天日期。
注: FineReport 将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。
在 1900 年日期系统中,FineReport 电子表格将 1900 年 1 月 1 日保存为系列数 2,将 1900 年 1 月 2日保存为系列数 3,将 1900 年 1 月 3 日保存为系列数 4……依此类推。
如:在 1900 年日期系统,1998 年 1 月 1 日存为系列数 35796。
示例:
YEAR("2000/1/1") 等于 2000。
YEAR("2006/05/05") 等于 2006。
YEAR("1997/04/20") 等于 1997。
YEAR(35796) 等于 1998。
29. YEARDELTA
YEARDELTA(date, delta):返回指定日期后delta年的日期。
示例:
YEARDELTA("2008-10-10",10) 等于 2018-10-10。
30. LUNAR
LUNAR(year,day,month):返回当前日期对应的农历时间。year,month,day:分别对应年月日。
示例:
如果需要查询 2011 年 7 月 21 日对应的农历时间,则:
LUNAR(2011,7,21) 结果将显示为:辛卯年六月廿一。
LUNAR(2001,7,21) 结果显示:辛巳年六月初一 。
注:本公式支持的时间段为 1900-2049 年。
31. ENDOFMONTH-日期所在月份之前或之后月份的最后一天的日期值
1)概述
语法 | ENDOFMONTH(date,number) | 回指定日期所在月份之前或之后月份的最后一天的日期值 |
---|---|---|
参数1 | date | 指定日期,可缺省;缺省时默认为本月; |
参数2 | number | 指定月份前/后月份的数量,整数,可缺省; 缺省或者为0时,默认为date参数当月; 正整数时,为date之后的月份; 负整数时为date之前的月份; |
2)注意事项
不支持第一个参数缺省时第二个参数不缺省。
3)示例
ENDOFMONTH("2021-12-22")等于2021-12-31
ENDOFMONTH("2021-12-22",12)等于2022-12-31
ENDOFMONTH("2021-12-22",-12)等于2020-12-31
ENDOFMONTH("2021-12-22",36)等于2024-12-31
32. ISWORKDAY-判断日期是工作日还是周末
1)概述
语法 | ISWORKDAY(date) | 判断某日期是工作日还是周末;工作日返回true,非工作日返回false; |
---|---|---|
参数1 | date | 具体的日期值,可以是日期型、可转换为日期的字符型;可缺省,缺省时默认为当前日期 |
2)注意事项
暂时仅支持周末和工作日判断,暂时不支持法定节假日。
3)示例
ISWORKDAY("2021-12-30")等于true
ISWORKDAY("2021-01-02")等于false