如何从tbl表的start_date列获取每月的第一天?
获取tbl表start_date列每个月第一天的SQL实现
嘿,这个需求在日常开发里挺常见的,不同数据库有不同的简洁写法,我给你整理几个主流数据库的实现方式:
MySQL/MariaDB
有两种常用写法,选哪个都可以:
- 直接格式化日期到当月第一天:
SELECT DATE_FORMAT(start_date, '%Y-%m-01') AS first_day_of_month FROM tbl;
- 通过日期减法计算:
SELECT DATE_SUB(start_date, INTERVAL DAYOFMONTH(start_date) - 1 DAY) AS first_day_of_month FROM tbl;
如果需要去重(比如同一个月有多条记录,只保留一条第一天),加上DISTINCT就行:
SELECT DISTINCT DATE_FORMAT(start_date, '%Y-%m-01') AS first_day_of_month FROM tbl;
PostgreSQL
用DATE_TRUNC函数最简洁,它会把日期截断到指定的时间单位,这里指定month后转成日期类型就是当月第一天:
SELECT DATE_TRUNC('month', start_date)::DATE AS first_day_of_month FROM tbl;
同样,去重的话加DISTINCT:
SELECT DISTINCT DATE_TRUNC('month', start_date)::DATE AS first_day_of_month FROM tbl;
SQL Server
推荐用DATEFROMPARTS直接构造日期,可读性拉满:
SELECT DATEFROMPARTS(YEAR(start_date), MONTH(start_date), 1) AS first_day_of_month FROM tbl;
另外还有一种经典的写法,通过计算月份差来得到当月第一天:
SELECT DATEADD(month, DATEDIFF(month, 0, start_date), 0) AS first_day_of_month FROM tbl;
Oracle
用TRUNC函数指定MM参数,直接截断到当月第一天:
SELECT TRUNC(start_date, 'MM') AS first_day_of_month FROM tbl;
根据你实际使用的数据库选对应的语句就好啦~
内容的提问来源于stack exchange,提问作者Kirill D
相关产品推荐
相关产品推荐

