对于“2012-07-12”,我怎样才能得到一周的开始,即“2012-07-08”,以及月份的开始,即“2012-07-01”?
问问题
21952 次
5 回答
30
每月第一天:
SELECT DATE_FORMAT('2007-07-12', '%Y-%m-01');
输出:2007-07-01
一周的第一天:
SELECT DATE_SUB('2007-07-12', INTERVAL DAYOFWEEK('2007-07-12')-1 DAY);
输出:2007-07-08
MySQL 参考:http ://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add
于 2012-07-12T23:00:50.020 回答
11
与Borophyll 的答案相同,但我改变了当月第一天的行为以返回日期,而不仅仅是一个字符串,它避免了user151220 的答案中提到的日期格式/解析。
每月第一天:
SELECT DATE_SUB('2007-07-12', INTERVAL DAYOFMONTH('2007-07-12') - 1 DAY);
输出:2007-07-01
一周的第一天:
SELECT DATE_SUB('2007-07-12', INTERVAL DAYOFWEEK('2007-07-12') - 1 DAY);
输出:2007-07-08
MySQL 参考:http ://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add
于 2014-11-13T08:03:05.537 回答
1
Borophyll 的 DATE_FORMAT 回复非常好,但给出的是字符串而不是日期。所以不能轻易比较。
如果您需要将此用作与日期字段的比较,请使用str_to_date将其反转回日期而不是字符串。
select x from y where date >= str_to_date( DATE_FORMAT(now()-interval 12 month,'Y-%m-01'), '%Y-%m-%d')
如果您(例如)查看 12 个月的销售数据,但您希望始终从每月 1 日开始。
于 2013-09-06T15:50:22.003 回答
0
如果您只想对其进行编码而忘记它,这将起作用,它现在将使用 datetime 并始终返回 MTD 结果-
where date_completed between date_sub(date(now()), INTERVAL dayofmonth(now()) -1 day) and now()
于 2016-07-26T15:32:01.723 回答