SQL中Extract(year from 列)返回带一位小数年份,原因何在?
问题解决:提取年份返回带小数的数值
原因分析
你遇到的问题核心是数据库函数的返回类型定义:部分数据库(比如Hive、Spark SQL,或是特殊配置下的MySQL)中,extract(year ...)、YEAR()、DATEPART(year ...)这类函数默认返回浮点型(FLOAT/DOUBLE),而非整数类型,所以结果会显示为2019.0这类带小数的格式。哪怕你的字段是标准datetime类型,只要函数本身的返回类型是浮点型,就会出现这个情况。
解决办法
通过类型转换把结果转为整数即可,不同数据库的写法参考如下:
- MySQL/PostgreSQL:
SELECT CAST(extract(year from orders.OrderDate) AS INTEGER) AS order_year; -- 或者用YEAR函数转换 SELECT CAST(YEAR(orders.OrderDate) AS UNSIGNED) AS order_year; - Hive/Spark SQL:
SELECT cast(extract(year from orders.OrderDate) as int) AS order_year; -- 或者简化写法 SELECT int(year(orders.OrderDate)) AS order_year; - SQL Server:
SELECT CONVERT(INT, DATEPART(year, orders.OrderDate)) AS order_year;
如果上述转换仍无效,建议检查OrderDate字段是否被误存为带小数的高精度时间类型(比如timestamp(6)),但这种情况极少影响年份提取结果,优先尝试类型转换即可。
内容的提问来源于stack exchange,提问作者lu yan
相关产品推荐
相关产品推荐

