如何获得每个相应月份的第一天在MySQL?

我想要得到当年的每个相应月份的第一天。 例如,如果用户select“2010-06-15”,则查询要求从“2010-06-01”而不是“2010-06-15”运行。

请帮助我如何计算选定date的第一天。 目前,我正在尝试使用下面的mysql select查询来获取所需的值:

Select DAYOFMONTH(hrm_attendanceregister.Date) >= DAYOFMONTH( DATE_SUB('2010-07-17', INTERVAL - DAYOFMONTH('2010-07-17') + 1 DAY ) FROM hrm_attendanceregister; 

谢谢

这是你想要的:

 select CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE); 

实际上有一个简单的解决scheme,因为这个月的第一天就是today - (day_of_month_in_today - 1)

 select now() - interval (day(now())-1) day 

与其他非常迂回和间接的方法相比较。


而且,由于我们对时间分量不感兴趣,因此curdate()now()更好(也更快now() 。 我们还可以利用subdate()的2元重载,因为它比使用intervalsubdate() 。 所以更好的解决scheme是:

 select subdate(curdate(), (day(curdate())-1)) 

您可以使用MySQL提供的LAST_DAY函数来检索任何月份的最后一天,这很容易:

 SELECT LAST_DAY('2010-06-15'); 

将返回:

 2010-06-30 

不幸的是,MySQL不提供任何FIRST_DAY函数来检索一个月的第一天(不知道为什么)。 但是,考虑到最后一天,你可以添加一天,减去一个月,以获得第一天。 因此你可以定义一个自定义函数:

 DELIMITER ;; CREATE FUNCTION FIRST_DAY(day DATE) RETURNS DATE DETERMINISTIC BEGIN RETURN ADDDATE(LAST_DAY(SUBDATE(day, INTERVAL 1 MONTH)), 1); END;; DELIMITER ; 

那样:

 SELECT FIRST_DAY('2010-06-15'); 

将返回:

 2010-06-01 

这是旧的,但这可能会有助于新的人类networking爬虫XD

在本月的第一天,您可以使用:

 SELECT LAST_DAY(NOW() - INTERVAL 1 MONTH) + INTERVAL 1 DAY; 

您可以使用EXTRACT获取您想要的date部分:

 EXTRACT( YEAR_MONTH FROM DATE('2011-09-28') ) -- 201109 

这适用于分组。

使用date_format方法,只检查月份和年份

 select * from table_name where date_format(date_column, "%Y-%m")="2010-06" 

我很惊讶没有人提出类似这样的事情(我不知道它是如何performance的):

 CONCAT_WS('-', YEAR(CURDATE()), MONTH(CURDATE()), '1') 

如有必要,可以执行其他date操作以删除格式

 date_add(subdate(curdate(), interval day(?) day), interval 1 day) 

改变? 为相应的date

您可以使用DATE_FORMAT()函数来获取任何date字段的第一天。

 SELECT DATE_FORMAT(CURDATE(),'%Y-%m-01') as FIRST_DAY_CURRENT_MONTH FROM dual; 

更改Curdate()与任何其他date字段,如:

 SELECT DATE_FORMAT(purchase_date,'%Y-%m-01') AS FIRST_DAY_SALES_MONTH FROM Company.Sales; 

然后,用你自己的问题:

 SELECT * FROM hrm_attendanceregister WHERE hrm_attendanceregister.Date) >= DATE_FORMAT(CURDATE(),'%Y-%m-01') 

您可以使用任何其他给定的date更改CURDATE()。

这对我来说很好。

  date(SUBDATE("Added Time", INTERVAL (day("Added Time") -1) day)) 

** 用列名称replace“添加时间”

用例:

  1. 如果您想重置除“ 月份”和“ 年份”之外的所有date字段。

  2. 如果你想保留列的格式为“date”。 (不是“文本”或“数字”)

慢(17s):SELECT BENCHMARK(100000000,current_date – INTERVAL(day(current_date)-1)DAY); SELECT BENCHMARK(100000000,cast(DATE_FORMAT(current_date,'%Y-%m-01')as date));

如果您不需要datetypes,则速度会更快:快速(6秒):SELECT BENCHMARK(100000000,DATE_FORMAT(CURDATE(),'%​​Y-%m-01')); SELECT BENCHMARK(100000000,DATE_FORMAT(current_date,'%Y-%m-01'));

 select big.* from (select @date := '2010-06-15')var straight_join (select * from your_table where date_column >= concat(year(@date),'-',month(@date),'-01'))big; 

这不会创build一个完整的表扫描。