在MySQL中,要获取上个月的第一天,你可以使用DATE_SUB
和LAST_DAY
函数结合INTERVAL
来实现。下面是一个示例SQL表达式,用于获取上个月的第一天:
SELECT DATE_SUB(LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) + INTERVAL 1 DAY, INTERVAL 0 DAY) AS first_day_of_previous_month;
让我们逐步解析这个表达式:
CURDATE()
: 返回当前日期。DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
: 从当前日期中减去一个月,得到上个月的某一天(具体是哪一天取决于当前日期)。LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 1 MONTH))
: 使用LAST_DAY
函数找到上个月的最后一天。LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) + INTERVAL 1 DAY
: 在上个月的最后一天上加一天,这将跨越到下个月的第一天。DATE_SUB(..., INTERVAL 0 DAY)
: 这个DATE_SUB
调用实际上是多余的,因为减去0天不会改变日期。它在这里主要是为了保持格式的一致性,虽然你可以直接省略这部分。
最后,AS first_day_of_previous_month
是一个别名,用于在结果集中标识这个字段。
整个表达式的作用是首先找到上个月的最后一天,然后加一天得到下个月的第一天,但由于我们是从上个月的最后一天开始加的,所以实际上得到的是上个月的第一天。
一个更简洁的方法是直接使用DATE_FORMAT
和YEARWEEK
或YEARMONTH
来获取上个月的第一天:
SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH), '%Y-%m-01') AS first_day_of_previous_month;
这里,DATE_FORMAT
用于格式化日期,而%Y-%m-01
指定了年份、月份和第一天的格式。DATE_SUB(NOW(), INTERVAL 1 MONTH)
计算了当前时间减去一个月后的日期,但由于我们只关心年份和月份,所以%Y-%m-01
确保了日期部分总是1,即每个月的第一天。