DATE函数
一、日期函数完整对比表¶
| 函数 | 用途 | 语法 | 参数说明 | 示例 | 返回值类型 | 注意事项 |
|---|---|---|---|---|---|---|
| DATE() | 组合年、月、日创建标准日期 | =DATE(year, month, day) |
year: 年份(1900-9999) month: 月份(1-12) day: 日期(1-31) |
=DATE(2024, 3, 15) → 2024/3/15 |
日期(序列值) | 1. 月份>12会进位到下年 2. 日期>当月天数会进位到下月 3. 年份<1900会自动加1900 |
| TODAY() | 返回当前系统日期(不含时间) | =TODAY() |
无参数 | =TODAY() → 2024/3/15 |
日期(序列值) | 1. 每次打开文件或计算时更新 2. 不包含时间信息 3. 按F9可固定当前值 |
| NOW() | 返回当前系统日期和时间 | =NOW() |
无参数 | =NOW() → 2024/3/15 14:30:25 |
日期时间(序列值) | 1. 包含日期和时间 2. 时间是小数值(0-0.999) 3. 同样会实时更新 |
| YEAR() | 从日期中提取年份 | =YEAR(serial_number) |
serial_number: Excel日期序列值或日期格式 | =YEAR("2024-03-15") → 2024 |
整数 | 1. 返回1900-9999的整数 2. 参数必须是有效日期 |
| MONTH() | 从日期中提取月份 | =MONTH(serial_number) |
serial_number: Excel日期序列值或日期格式 | =MONTH("2024-03-15") → 3 |
整数(1-12) | 1. 总是返回1-12的整数 2. 配合CHOOSE可转成月份名 |
| DAY() | 从日期中提取日数 | =DAY(serial_number) |
serial_number: Excel日期序列值或日期格式 | =DAY("2024-03-15") → 15 |
整数(1-31) | 1. 返回当月的第几天 2. 可计算当月剩余天数 |
二、DATE() 函数参数处理规则¶
| 参数 | 合法范围 | 特殊处理 | 示例 |
|---|---|---|---|
| year | 1900-9999 | 0-1899会自动加1900 | =DATE(100, 1, 1) → 2000/1/1 |
| month | 1-12(常规) | >12会进位到下年 | =DATE(2024, 15, 1) → 2025/3/1 |
| 负数 | 向前推算月份 | =DATE(2024, -2, 1) → 2023/10/1 |
|
| day | 1-31(常规) | >当月天数进位到下月 | =DATE(2024, 2, 30) → 2024/3/1 |
| 0或负数 | 向前推算日期 | =DATE(2024, 3, 0) → 2024/2/29 |
三、提取函数示例对比¶
| 原始日期 | YEAR() | MONTH() | DAY() | 星期几(扩展) |
|---|---|---|---|---|
| 2024/3/15 | 2024 | 3 | 15 | 5(星期五) |
| 2023/12/31 | 2023 | 12 | 31 | 7(星期日) |
| 2024/2/29 | 2024 | 2 | 29 | 4(星期四) |
| 1900/1/1 | 1900 | 1 | 1 | 1(星期一) |
四、日期计算常见需求¶
| 需求 | 公式示例 | 说明 |
|---|---|---|
| 计算年龄 | =YEAR(TODAY())-YEAR(出生日期) |
简易年龄计算 |
| 精确年龄 | =DATEDIF(出生日期,TODAY(),"Y") |
考虑月份和日期的精确年龄 |
| 当月第一天 | =DATE(YEAR(A1), MONTH(A1), 1) |
任何日期的当月1号 |
| 当月最后一天 | =EOMONTH(A1, 0) |
需要EOMONTH函数 |
| 季度判断 | =INT((MONTH(A1)-1)/3)+1 |
返回1-4季度 |
| 工作日计算 | =NETWORKDAYS(开始日期,结束日期) |
排除周末 |
| 日期转文本 | =TEXT(A1, "yyyy年mm月dd日") |
自定义格式显示 |
五、TODAY() 和 NOW() 的应用场景¶
| 函数 | 应用场景 | 公式示例 | 结果示例 |
|---|---|---|---|
| TODAY() | 到期提醒 | =IF(到期日期<TODAY(),"已过期","有效") |
根据当天判断 |
| 计算天数 | =TODAY()-开始日期 |
已进行天数 | |
| 动态标题 | ="报告日期:"&TEXT(TODAY(),"yyyy-mm-dd") |
报告日期:2024-03-15 | |
| NOW() | 时间戳 | =NOW() |
记录操作时间 |
| 计算时长 | =(NOW()-开始时间)*24 |
小时数 | |
| 倒计时 | =INT((结束时间-NOW())*1440) |
剩余分钟数 |
六、常见错误和解决方法¶
| 错误现象 | 可能原因 | 解决方法 |
|---|---|---|
| #VALUE! | 参数不是有效日期 | 使用DATEVALUE()转换文本=DATEVALUE("2024-03-15") |
| 显示为数字 | 单元格格式不对 | 设置单元格格式为日期 |
| TODAY()不更新 | 手动计算模式 | 按F9刷新或设置自动计算 |
| 年份显示1900 | 年份为0 | 检查year参数是否为空或0 |
| 月份显示错误 | month为0或负数 | 理解进位规则,使用正数月份 |
| DAY()返回0 | day参数为0 | =DATE(2024,3,0)返回2月最后一天 |
七、日期序列值说明¶
| 概念 | 值 | 说明 |
|---|---|---|
| 日期基准 | 1 | 1900年1月1日 = 1 |
| 时间表示 | 小数 | 12:00:00 = 0.5 18:00:00 = 0.75 |
| NOW()值 | 数字 | 2024/3/15 14:30 = 45356.6042 |
| 转换方法 | 格式 | 数字 → 右键设置单元格格式为日期 |
八、快速记忆口诀¶
九、使用建议¶
- 输入日期时:尽量使用DATE()函数,避免文本格式问题
- 动态日期:报表中使用TODAY(),保证每天自动更新
- 时间记录:数据录入时间用NOW()作为时间戳
- 日期计算:先提取YEAR/MONTH/DAY,再进行逻辑判断
- 格式统一:所有日期相关单元格使用相同日期格式
DATE()练习¶
-
创建特定日期
-
月份自动进位
-
日期自动进位
TODAY()练习¶
1.显示当前日期
2.计算距离春节还有多少天3.计算员工入职天数
| 员工ID | 姓名 | 入职日期 | 出生日期 | 入职天数 |
|---|---|---|---|---|
| E001 | 张三 | 2018-03-15 | 1990-05-20 | =TODAY() - C2 |
| E002 | 李四 | 2016-12-08 | 1992-01-20 | =TODAY() - C2 |
4.在项目任务表中计算项目剩余天数
| 任务ID | 项目名称 | 结束日期 | 剩余天数 |
|---|---|---|---|
| P001 | 官网重构 | 2024-01-31 | =C2-TODAY() |
MONTH()练习¶
1.提取月份
2.计算员工转正日期(试用期3个月)
| 员工ID | 姓名 | 入职日期 | 出生日期 | 转正日期 |
|---|---|---|---|---|
| E001 | 张三 | 2018-03-15 | 1990-05-20 | =DATE(YEAR(C2), MONTH(C2)+3, DAY(C2)) |
3.生日月份提醒
YEAR()练习¶
在销售订单表中按年份统计:
| 订单ID | 下单日期 | 年份 |
|---|---|---|
| S001 | 2024-01-03 | =YEAR(B2) |
2.在员工基本信息表中计算员工工龄
| 员工ID | 姓名 | 入职日期 | 出生日期 | 工龄计算 |
|---|---|---|---|---|
| E001 | 张三 | 2018-03-15 | 1990-05-20 | =DATE(YEAR(TODAY())-YEAR(C2),1,1) |
3.在员工基本信息表中计算员工年龄:
| 员工ID | 姓名 | 入职日期 | 出生日期 | 年龄计算 |
|---|---|---|---|---|
| E001 | 张三 | 2018-03-15 | 1990-05-20 | =DATE(YEAR(TODAY())-YEAR(D2),1,1) |
DAY()练习¶
1.提取日数
2.生成月度报告标题
一、基础练习题(初级)¶
练习1:创建动态日期标题¶
场景:每天制作日报,标题需要自动更新为当天日期
要求:
- 在A1单元格创建标题,格式为"销售日报(YYYY年MM月DD日)"
- 每天打开表格时,日期自动更新为当天
示例:
练习2:判断产品是否过期¶
场景:库存管理中检查食品保质期
数据:
| A | B | C |
|---|---|---|
| 产品名称 | 生产日期 | 保质期(天) |
| 牛奶 | 2025-12-25 | 15 |
| 面包 | 2025-12-30 | 7 |
| 鸡蛋 | 2026-01-01 | 30 |
要求:
在D列添加"状态"列,判断产品是否过期: - 如果过期显示"已过期" - 如果3天内过期显示"即将过期" - 否则显示"正常"
练习3:计算项目已进行天数¶
场景:项目进度跟踪
数据:
| A | B |
|---|---|
| 项目名称 | 开始日期 |
| 官网开发 | 2025-11-01 |
| 移动端APP | 2025-12-15 |
| 数据库升级 | 2026-01-01 |
要求:
- 在C列计算每个项目已进行的天数
- 在D列计算已进行的完整周数
二、中级练习题¶
练习4:会议倒计时系统¶
场景:办公室会议室预约管理
数据:
| A | B | C |
|---|---|---|
| 会议主题 | 开始时间 | 负责人 |
| 季度总结会 | 2026-01-10 14:30 | 张三 |
| 产品评审会 | 2026-01-05 09:00 | 李四 |
| 技术分享会 | 2026-01-07 15:00 | 王五 |
要求:
- 在D列显示"状态":
- 会议已开始:"进行中"
- 会议未开始:显示"还有X天X小时"
- 会议已结束:"已完成"
- 在E列显示倒计时分钟数(会议开始前)
练习5:员工生日提醒系统¶
场景:人事部员工生日提醒
数据:
| A | B |
|---|---|
| 员工姓名 | 出生日期 |
| 张三 | 1990-05-20 |
| 李四 | 1992-08-12 |
| 王五 | 1993-11-05 |
要求:
- 在C列计算员工年龄
- 在D列显示"生日提醒":
- 今天生日:"🎂今天生日!"
- 7天内生日:"即将生日(还有X天)"
- 其他:""
练习6:工时计算器¶
场景:员工加班时长计算
数据:
| A | B |
|---|---|
| 员工姓名 | 开始加班时间 |
| 张三 | 2026-01-03 18:30 |
| 李四 | 2026-01-03 19:00 |
| 王五 | 2026-01-04 17:45 |
要求:
假设公司规定: - 工作日加班:18:00后开始计算 - 周末加班:全天计算
在C列计算:
- 实时加班时长(小时,保留1位小数)
- 加班费(假设时薪50元)
一、基础练习题答案¶
练习1:创建动态日期标题¶
答案:
解释: -TODAY() 获取当天日期
- TEXT(日期,"格式") 将日期转为指定格式的文本
- & 连接文本
练习2:判断产品是否过期¶
答案:
分步解释:
1. B2+C2:生产日期 + 保质期天数 = 过期日期
2. TODAY()>B2+C2:如果今天 > 过期日期 → 已过期
3. TODAY()>=B2+C2-3:如果今天 ≥ 过期日期前3天 → 即将过期
4. 否则 → 正常
示例结果(假设今天是2026-01-04): - 牛奶:2025-12-25 + 15天 = 2026-01-09 → "正常" - 面包:2025-12-30 + 7天 = 2026-01-06 → "即将过期" - 鸡蛋:2026-01-01 + 30天 = 2026-01-31 → "正常"
练习3:计算项目已进行天数¶
答案:
分步解释:
1. TODAY()-B2:今天 - 开始日期 = 已进行天数
2. INT(天数/7):天数 ÷ 7,取整数部分 = 完整周数
示例结果(假设今天是2026-01-04): - 官网开发:2025-11-01开始 → 64天,9周 - 移动端APP:2025-12-15开始 → 20天,2周 - 数据库升级:2026-01-01开始 → 3天,0周
二、中级练习题答案¶
练习4:会议倒计时系统¶
答案:
D2单元格(状态列):
=IF(NOW()>B2,"进行中",
IF(NOW()>B2-"0:30","即将开始",
INT(B2-NOW())&"天"&TEXT((B2-NOW()-INT(B2-NOW()))*24,"0")&"小时"))
E2单元格(倒计时分钟数):
=IF(B2>NOW(), INT((B2-NOW())*1440), "")
分步解释:
状态列公式:
1. NOW()>B2:如果现在时间 > 会议开始时间 → "进行中"
2. NOW()>B2-"0:30":如果现在时间 > 会议开始前30分钟 → "即将开始"
3. 否则:计算剩余天数和小时
- INT(B2-NOW()):取整数天数
- (B2-NOW()-INT(B2-NOW()))*24:剩余小时的小数部分转为小时数
倒计时分钟公式:
- (B2-NOW())*1440:剩余天数 × 24小时 × 60分钟 = 剩余分钟数
- 1440 = 24小时 × 60分钟
- IF(B2>NOW(), ..., ""):只显示会议开始前的倒计时
示例结果(假设现在是2026-01-04 10:00): - 季度总结会(1月10日14:30):"6天4小时",剩余分钟:9166 - 产品评审会(1月5日09:00):"还有1天23小时",剩余分钟:2820 - 技术分享会(1月7日15:00):"还有3天5小时",剩余分钟:4620
练习5:员工生日提醒系统¶
答案:
C2单元格(年龄):
=YEAR(TODAY())-YEAR(B2)-IF(TODAY()<DATE(YEAR(TODAY()),MONTH(B2),DAY(B2)),1,0)
D2单元格(生日提醒):
=IF(TEXT(TODAY(),"mm-dd")=TEXT(B2,"mm-dd"),"🎂今天生日!",
IF(DATEDIF(TODAY(),DATE(YEAR(TODAY()),MONTH(B2),DAY(B2)),"d")<=7,
"即将生日(还有"&DATEDIF(TODAY(),DATE(YEAR(TODAY()),MONTH(B2),DAY(B2)),"d")&"天)",""))
分步解释:
年龄公式:
1. YEAR(TODAY())-YEAR(B2):今年年份 - 出生年份
2. IF(TODAY()<DATE(YEAR(TODAY()),MONTH(B2),DAY(B2)),1,0):
- 如果今天还没到今年的生日,减1岁
- DATE(YEAR(TODAY()),MONTH(B2),DAY(B2)):今年的生日日期
生日提醒公式:
1. TEXT(TODAY(),"mm-dd")=TEXT(B2,"mm-dd"):比较月日是否相同 → 今天生日
2. DATEDIF(TODAY(),今年生日,"d"):今天距离今年生日的天数
3. 如果≤7天 → 即将生日
示例结果(假设今天是2026-01-04): - 张三:1990-05-20 → 年龄35岁,无提醒 - 李四:1992-08-12 → 年龄33岁,无提醒 - 王五:1993-11-05 → 年龄32岁,无提醒 如果今天是5月20日,张三显示:"🎂今天生日!"
练习6:工时计算器¶
答案:
C2单元格(实时加班时长):
=IF(WEEKDAY(B2,2)<6, // 判断是否是工作日(周一到周五)
IF(TIME(HOUR(B2),MINUTE(B2),SECOND(B2))>TIME(18,0,0),
(NOW()-B2)*24,
IF(NOW()>B2+TIME(18,0,0)-TIME(HOUR(B2),MINUTE(B2),SECOND(B2)),
(NOW()-(INT(B2)+TIME(18,0,0)))*24,
0)),
(NOW()-B2)*24) // 周末全天计算
D2单元格(加班费):
=ROUND(C2*50,1)
简化版本(如果B列已经是完整日期时间):
C2单元格:
=IF(WEEKDAY(B2,2)<6, // 工作日
MAX(0,(NOW()-MAX(B2,INT(B2)+18/24))*24), // 18点后开始计算
(NOW()-B2)*24) // 周末
分步解释:
1. WEEKDAY(B2,2)<6:判断是否是工作日(周一到周五)
2. 工作日情况:
- 如果开始时间>18:00:直接计算(NOW()-B2)*24
- 如果现在时间>当天18:00:从18:00开始计算加班
- 否则:0小时(还没到加班时间)
3. 周末情况:全天都算加班
4. ROUND(小时数*50,1):计算加班费,保留1位小数
示例结果(假设现在是2026-01-04 20:30): - 张三:1月3日18:30开始 → 26.0小时,加班费1300元 - 李四:1月3日19:00开始 → 25.5小时,加班费1275元 - 王五:1月4日17:45开始 → 2.8小时,加班费140元
三、实用技巧总结¶
1. TODAY() vs NOW() 选择¶
- 只关心日期:用
TODAY() - 需要精确时间:用
NOW()
2. 常见错误避免¶
- 单元格格式问题:数字显示为日期 → 设置格式为"常规"
- 实时更新:按F9手动刷新计算
3. 性能优化¶
- 大量数据时,考虑将
NOW()转换为静态值 - 使用
TODAY()代替NOW()如果不需要时间部分
4. 日期计算技巧¶
- 天数差:直接相减
- 工作日计算:
NETWORKDAYS() - 精确时间差:
(结束-开始)*24(小时)或*1440(分钟)