我希望获得当年每个月的第一天。例如,如果用户选择“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;
由于
答案 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))
** 将“添加时间”替换为列名
用例:
如果您要重置除月和年之外的所有日期字段。
如果您想将列格式保留为“日期”。 (而不是“文字”或“数字”)
答案 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;
这不会创建全表扫描。