# P29 29. 基础-函数-日期函数

> 本页是学习笔记，不等同于视频逐字稿。原声字幕未取得（匿名接口字幕轨为空且需登录，未使用任何账号），也没有逐句讲解记录；讲义只按节与页码对应，切点未逐句确证。

> 以同版讲义的公开镜像核对章节与页码（镜像非官方出品）；非逐字稿，示例为原创补充。

## P29 29. 基础-函数-日期函数

- 原视频：https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=29（p=29），时长 9:27
- 讲义：3.3 日期函数 p58–59（公开镜像；按主题对应，切点 notexact）

- 本集练习数据：practice/p29.sql（先执行，再对照小例）

### 一句话理解

日期函数用来取当前时间、拆出年月日、做日期加减，以及算两个日期差多少天。

### 步骤

1. 取当前：CURDATE() 只要日期，CURTIME() 只要时间，NOW() 日期时间都要。
2. 拆字段：YEAR / MONTH / DAY 从日期里取出对应部分。
3. 加减：DATE_ADD(日期, INTERVAL n DAY)，单位可换成 MONTH、YEAR。
4. 算差：DATEDIFF(d1,d2) 得 d1−d2 的天数；算整年数用 TIMESTAMPDIFF(YEAR, 起始, 结束)。

### SQL 示例

```
SELECT DATEDIFF('2026-10-22', '2026-10-01') AS 相差天数,
       TIMESTAMPDIFF(YEAR, '2004-12-31', '2026-10-22') AS 周岁,
       YEAR('2004-12-31') AS 出生年,
       DATE_ADD('2026-10-22', INTERVAL 7 DAY) AS 一周后;
```

说明：【原创演示】全部用固定日期字面量，不写 NOW()，所以每次结果都一样。差值 21 天；2004-12-31 出生到 2026-10-22 还没过生日，周岁是 21，而 2026−2004=22 只是年份相减；一周后是 2026-10-29。

### 易错点

- 用 YEAR(今天) − YEAR(生日) 当年龄：没过生日的人会被多算一岁，差一天就错。
- DATEDIFF 参数顺序记反：DATEDIFF(a,b) 是 a−b，反过来符号相反。
- 在示例和测试里写 NOW()：每次运行结果都变，断言无法复现；固定日期字面量才能稳定对比。

### 30 秒速记

CURDATE/CURTIME/NOW、YEAR/MONTH/DAY、DATE_ADD、DATEDIFF(a−b)、TIMESTAMPDIFF 算整年；测试用固定日期。

### 自测

1. 为什么算年龄不能用 YEAR(CURDATE()) − YEAR(birthday)？
   - 答：它只比较年份，忽略今年生日是否已过；应使用 TIMESTAMPDIFF(YEAR, birthday, CURDATE())，它按完整年数计算。
2. DATEDIFF('2026-10-01','2026-10-22') 是正还是负？
   - 答：负。函数是前一个日期减后一个日期，10-01 减 10-22 得 −21。

### 材料与来源

- [平台视频页] P29 原视频页（BV1Kr4y1i7ru） https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=29
- [官方文档] MySQL 8.0 Reference：日期与时间函数 https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html

证据说明：按 t012/t040 帧核对：画面标题为“日期函数”，其余帧是代码区，未取得完整函数表。函数名另由 P31 小结页（CURDATE、CURTIME、NOW、YEAR、MONTH、DAY、DATE_ADD、DATEDIFF）核对；TIMESTAMPDIFF 属文档补充，正文已单独说明用途。示例为原创且使用固定日期；无字幕。
