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

如何基于SQL的DATEPART年月查询语句获取每月第一天?

嘿,我懂你的问题啦——你现在是想从现有查询里拿到每个年月对应的当月第一天,而不是每条记录的具体日份对吧?直接加DATEPART("dd", datum)肯定不行,因为它会把每条记录的日都拆出来,破坏了distinct按年月去重的效果。下面给你几种不同数据库的解决方案,你可以根据自己用的数据库来选:

按数据库分类的解决方案

SQL Server(你原查询用了DATEPART,大概率是这个)

最直接的方法是用DATEFROMPARTS函数,把提取到的年份、月份和数字1组合,直接生成当月第一天:

select distinct 
    DATEPART(yyyy, datum) AS year, 
    DATEPART(mm, datum) AS month,
    DATEFROMPARTS(DATEPART(yyyy, datum), DATEPART(mm, datum), 1) AS first_day_of_month
from your_table_name; -- 记得替换成你的表名

如果是老版本SQL Server不支持DATEFROMPARTS,可以用DATEADD+DATEDIFF的经典组合,兼容性拉满:

select distinct 
    DATEPART(yyyy, datum) AS year, 
    DATEPART(mm, datum) AS month,
    DATEADD(month, DATEDIFF(month, 0, datum), 0) AS first_day_of_month
from your_table_name;

简单解释下:DATEDIFF(month, 0, datum)会算出从1900-01-01到目标日期的月份差,再用DATEADD把这个差值加回1900-01-01,就得到了目标日期所在月份的第一天。

MySQL/MariaDB

用DATE_FORMAT直接格式化日期,把日份固定为01:

select distinct 
    YEAR(datum) AS year, 
    MONTH(datum) AS month,
    DATE_FORMAT(datum, '%Y-%m-01') AS first_day_of_month
from your_table_name;

PostgreSQL

用DATE_TRUNC函数直接把日期截断到月份,结果就是当月第一天:

select distinct 
    EXTRACT(YEAR FROM datum) AS year, 
    EXTRACT(MONTH FROM datum) AS month,
    DATE_TRUNC('month', datum)::DATE AS first_day_of_month
from your_table_name;

核心思路其实很简单:不要去提取原日期的日份,而是基于年份和月份重新构造出当月第一天的日期,这样distinct就能按年月正确分组,每个年月只会返回一条带第一天的记录啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:22:06