SELECT YEAR(-1) AS MY-year 运行结果分析
一、直接答案
在 SQL Server 中运行,结果是:1899
text
MY-year ------- 1899
二、为什么是 1899?
SQL Server 使用 1900-01-01 作为日期的基准点(起点)。
数字 | 计算 | 对应日期 | 年份 |
0 | 1900-01-01 + 0天 | 1900-01-01 | 1900 |
-1 | 1900-01-01 - 1天 | 1899-12-31 | 1899 |
-2 | 1900-01-01 - 2天 | 1899-12-30 | 1899 |
计算过程
sql
SELECT YEAR(-1)
执行步骤:
-1被解释为 1900-01-01 减去 1天计算:
1900-01-01- 1天 =1899-12-31提取年份:
1899
三、验证代码
sql
SELECT -2 AS 数字, CAST(-2 AS datetime) AS 对应日期, YEAR(-2) AS 年份UNION ALLSELECT -1, CAST(-1 AS datetime), YEAR(-1)UNION ALLSELECT 0, CAST(0 AS datetime), YEAR(0)UNION ALLSELECT 1, CAST(1 AS datetime), YEAR(1);
结果:
| 数字 | 对应日期 | 年份 |
|---|---|---|
| -2 | 1899-12-30 | 1899 |
| -1 | 1899-12-31 | 1899 |
| 0 | 1900-01-01 | 1900 |
| 1 | 1900-01-02 | 1900 |
四、可视化时间轴
text
负数区域 | 正数区域 (1900年之前) | (1900年之后) ← | → -2 -1 0 1 2 │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ 1899-12-30 1899-12-31 1900-01-01 1900-01-02 1900-01-03 │ │ │ │ │ └────┬─────┘ └────┬─────┘ │ │ 年份=1899 年份=1900
五、AS MY-year 别名问题
sql
SELECT YEAR(-1) AS MY-year;
| 问题 | 说明 |
|---|---|
MY-year | 别名中的减号 - 会被误认为减法运算符 |
| 实际执行 | SQL Server 可能将 MY-year 解释为 MY 减去 year |
正确写法
sql
-- 方法1:使用方括号SELECT YEAR(-1) AS [MY-year];-- 方法2:使用双引号SELECT YEAR(-1) AS "MY-year";-- 方法3:避免使用特殊字符SELECT YEAR(-1) AS MY_year;
六、不同数据库的表现
| 数据库 | SELECT YEAR(-1) 结果 | 说明 |
|---|---|---|
| SQL Server | 1899 | 基准日期 1900-01-01 减去 1 天 |
| MySQL | NULL 或报错 | 要求参数必须是合法日期 |
| Oracle | 报错 | 要求日期类型 |
| PostgreSQL | 报错 | 要求日期类型 |
七、总结
| 问题 | 答案 |
|---|---|
SELECT YEAR(-1) 结果是多少? | 1899 |
| 为什么是 1899? | -1 被解释为 1900-01-01 减去 1 天 → 1899-12-31,年份是 1899 |
| 负数表示什么? | 1900 年之前的日期 |
0 代表什么? | 1900-01-01 |
| 如何正确写别名? | AS [MY-year] 或 AS "MY-year" |
一句话总结:SELECT YEAR(-1) 在 SQL Server 中结果是 1899,因为 -1 被解释为 1900-01-01 减去 1 天,得到 1899-12-31,年份是 1899;负数代表 1900 年之前的日期。同时注意别名中的减号需要用方括号或双引号包裹,避免被误认为减法运算