如何获取mysql中每个相应月份的第一天?

时间:2010-07-21 10:34:40

标签: mysql date

我希望获得当年每个月的第一天。例如,如果用户选择“2010-06-15”,则查询要求从“2010-06-01”而不是“2010-06-15”运行。

请帮助我如何计算所选日期的第一天。目前,我正在尝试使用以下mysql选择查询:

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

由于

14 个答案:

答案 0 :(得分:62)

这就是你要找的东西:

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

答案 1 :(得分:26)

您可以使用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

答案 2 :(得分:24)

实际上有一个直截了当的解决方案,因为这个月的第一天只是today - (day_of_month_in_today - 1)

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

与极为迂回和间接的other methods形成鲜明对比。


此外,由于我们对时间组件不感兴趣,curdate()是比now()更好(和更快)的功能。我们还可以利用subdate()的2-arity重载,因为这比使用interval更高效。所以更好的解决方案是:

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

答案 3 :(得分:13)

这是旧的,但这可能对新的人类网络抓取工具XD

有帮助

对于当月的第一天,您可以使用:

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

答案 4 :(得分:8)

您可以使用EXTRACT获取所需的日期部分:

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

这适用于分组。

答案 5 :(得分:2)

我很惊讶没有人提出类似于此的东西(我不知道它是多么高效):

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

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

答案 6 :(得分:2)

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

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

使用任何其他日期字段更改Curdate(),如:

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')

您可以使用任何其他指定日期更改CURDATE()。

答案 7 :(得分:1)

使用date_format方法并检查月份和时间年

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

答案 8 :(得分:0)

date_add(subdate(curdate(), interval day(?) day), interval 1 day)
改变?对应的日期

答案 9 :(得分:0)

这对我来说很好。

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

** 将“添加时间”替换为列名

用例:

  1. 如果您要重置除之外的所有日期字段。

  2. 如果您想将列格式保留为“日期”。 (而不是“文字”或“数字”)

答案 10 :(得分:0)

慢(17s): SELECT BENCHMARK(100000000,current_date - INTERVAL(day(current_date)-1)DAY); SELECT BENCHMARK(100000000,演员表(DATE_FORMAT(current_date,'%Y-%m-01')作为日期));

如果您不需要日期类型,则速度更快: 速度快(6s): SELECT BENCHMARK(100000000,DATE_FORMAT(CURDATE(),'%Y-%m-01')); SELECT BENCHMARK(100000000,DATE_FORMAT(current_date,'%Y-%m-01'));

答案 11 :(得分:0)

SELECT LAST_DAY(date) as last_date, DATE_FORMAT(date,'%Y-%m-01') AS fisrt_date FROM table_name

date =您的列名

答案 12 :(得分:0)

有许多方法可以计算一个月的第一天,以下是我的计算机上的效果(您可以在自己的计算机上尝试使用此功能)

获胜者是LAST_DAY(@D - interval 1 month) + interval 1 day

set @D=curdate();

select BENCHMARK(100000000, subdate(@D, (day(@D)-1))); -- 33 seconds
SELECT BENCHMARK(100000000, @D - INTERVAL (day(@D) - 1) DAY); -- 33 seconds
SELECT BENCHMARK(100000000, cast(DATE_FORMAT(@D, '%Y-%m-01') as date)); -- 29 seconds
SELECT BENCHMARK(100000000, LAST_DAY(@D - interval 1 month) + interval 1 day); -- 26 seconds

答案 13 :(得分:-1)

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;

这不会创建全表扫描。