11

对于“2012-07-12”,我怎样才能得到一周的开始,即“2012-07-08”,以及月份的开始,即“2012-07-01”?

4

5 回答 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 回答
4

对于那些需要将星期一作为一周第一天的人:

SELECT DATE_SUB('2007-07-12', INTERVAL WEEKDAY('2007-07-12') DAY);

输出:2007-07-09

这依赖于WEEKDAY函数,它从星期一开始,而不是DAYOFWEEK,它从星期日开始。

于 2016-02-14T15:38:44.240 回答
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 回答