SELECT YEAR(3) AS MY-year 运行结果分析
一、直接答案
在 SQL Server 中运行,结果是:1900
text
MY-year ------- 1900
不是 1903!
二、为什么是 1900,不是 1903?
SQL Server 的日期系统
SQL Server 使用 1900-01-01 作为日期的基准点(起点)。
| 数字 | 代表的日期 |
|---|---|
0 | 1900-01-01 |
1 | 1900-01-02 |
2 | 1900-01-03 |
3 | 1900-01-04 |
n | 1900-01-01 + n天 |
计算过程
sql
SELECT YEAR(3)
执行步骤:
3被解释为 1900-01-01 + 3天计算:
1900-01-01+ 3天 =1900-01-04提取年份:
1900
三、验证代码
sql
-- 验证数字与日期的对应关系SELECT 0 AS 数字, CAST(0 AS datetime) AS 对应日期, YEAR(0) AS 年份UNION ALLSELECT 1, CAST(1 AS datetime), YEAR(1)UNION ALLSELECT 2, CAST(2 AS datetime), YEAR(2)UNION ALLSELECT 3, CAST(3 AS datetime), YEAR(3);
结果:
| 数字 | 对应日期 | 年份 |
|---|---|---|
| 0 | 1900-01-01 | 1900 |
| 1 | 1900-01-02 | 1900 |
| 2 | 1900-01-03 | 1900 |
| 3 | 1900-01-04 | 1900 |
四、如果要得到 1903 怎么写?
YEAR() 只能从日期中提取年份,不能直接做算术运算。
sql
-- 错误理解:YEAR(3) 不会变成 1903-- YEAR() 只提取年份,不做加法-- 要得到 1903,应该直接写SELECT 1903 AS MY-year;-- 或者用加法SELECT 1900 + 3 AS MY-year;
五、其他数据库的表现
| 数据库 | SELECT YEAR(3) 结果 | 说明 |
|---|---|---|
| SQL Server | 1900 | 将数字转换为基准日期 1900-01-01 + 3天 |
| MySQL | NULL 或报错 | MySQL 要求参数必须是合法日期,数字会报错 |
| Oracle | 报错 | Oracle 要求日期类型 |
| PostgreSQL | 报错 | 同样要求日期类型 |
sql
-- MySQL 中会返回 NULL(不是 1900)SELECT YEAR(3); -- 结果:NULL
六、YEAR() 的正确用法
sql
-- ✅ 正确:从日期中提取年份SELECT YEAR('2024-04-15'); -- 2024SELECT YEAR(GETDATE()); -- 当前年份-- ✅ 正确:从日期时间中提取SELECT YEAR('2024-04-15 14:30:00'); -- 2024-- ❌ 错误:传入数字SELECT YEAR(2024); -- SQL Server: 1905(1900+2024天),不是 2024-- ✅ 想要数字 2024,直接写SELECT 2024;七、AS MY-year 别名注意
sql
SELECT YEAR(3) AS MY-year;
| 部分 | 说明 |
|---|---|
MY-year | 别名中包含减号 - |
| 问题 | 减号可能被误认为减法运算符 |
| 建议 | 用方括号或双引号包裹 |
sql
-- 推荐写法SELECT YEAR(3) AS [MY-year];SELECT YEAR(3) AS "MY-year";
八、总结
| 问题 | 答案 |
|---|---|
SELECT YEAR(3) 结果是多少? | 1900 |
| 为什么是 1900? | SQL Server 将数字 3 解释为 1900-01-01 加上 3 天 → 1900-01-04,年份是 1900 |
| 是 1903 吗? | ❌ 不是 |
YEAR() 的正确用途 | 从日期中提取年份,不是做算术运算 |
| 如何得到 1903? | SELECT 1900 + 3 或直接 SELECT 1903 |
一句话总结:SELECT YEAR(3) 在 SQL Server 中结果是 1900,因为 SQL Server 将数字 n 解释为 1900-01-01 加上 n 天,YEAR() 提取的是这个日期的年份,而不是把数字本身当作年份。YEAR() 是用来提取日期的年份,不是用来做加法运算的