如何基于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
相关产品推荐
相关产品推荐

