You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL中如何提取expense_date年份生成对应年度1月1日

需求场景

需要基于表rpt的expense_date字段,获取该字段日期所属年份的1月1日,目标格式为01-01-对应年份。
原有尝试的SQL如下:

select to_date(extract(year from rpt.expense_date),'yyyy') from rpt 

该写法无法正确返回预期结果,需要调整写法。

正确写法参考

原写法的问题在于:extract(year from 日期字段)返回的是整数类型的年份数值,仅传入年份+yyyy格式给to_date时,数据库无法自动补全月、日部分的取值,会出现解析异常或返回错误结果。可以根据你使用的数据库引擎,选择以下任意一种写法:

  • 字符串拼接方案(通用性最强)
    把提取到的年份和固定的-01-01拼接为完整的yyyy-MM-dd格式字符串,再转换为日期类型:
    -- 适配PostgreSQL、Hive、Spark SQL、Presto等多数引擎
    SELECT to_date(concat(extract(year from rpt.expense_date), '-01-01'), 'yyyy-MM-dd') FROM rpt;
    
  • 日期截断方案(性能更优,无字符串转换开销)
    直接用数据库内置的日期截断函数,将日期截断到年份维度,返回值就是当年的第一天:
    -- 适配PostgreSQL、Hive、Spark SQL、ClickHouse等支持date_trunc的引擎
    SELECT date_trunc('year', rpt.expense_date)::date FROM rpt;
    
    -- 适配Oracle
    SELECT trunc(rpt.expense_date, 'YEAR') FROM rpt;
    
    -- 适配MySQL
    SELECT DATE_FORMAT(rpt.expense_date, '%Y-01-01') FROM rpt;
    

内容的提问来源于stack exchange,提问作者user19110389

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 14:01:26