当前位置:  开发笔记 > 后端 > 正文

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

如何解决《如何获取mysql中每个相应月份的第一天?》经验,为你挑选了5个好方法。

我想获得当年每个月的第一天.例如,如果用户选择"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;

谢谢



1> Krunal..:

这是你想要的:

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


这是不必要的开销.您正在将日期转换为字符串,然后再将其转换回日期.我的解决方案要好得多.

2> Stéphane..:

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



3> Pacerier..:

实际上有一个简单的解决方案,因为这个月的第一天很简单today - (day_of_month_in_today - 1):

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

与其他非常迂回和间接的方法形成对比.


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

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


-1代表傲慢的语气和评论.您是否进行过基准测试以证明您的方法效率最高?我无法想象任何解决方案在典型数据集上都会明显变慢.
既然你似乎批评了其他人的解决方案,你至少可以自己回答这个问题.该人询问使用"选定日期"而不是当前日期.`SELECT SUBDATE(日期('2010-06-15'),(DAY('D)('2010-06-15')) - 1))

4> 小智..:

这是旧的,但这可能对新的人类网络爬虫XD有所帮助

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

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



5> Andrew Vit..:

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

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

这适用于分组.

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有