簡體   English   中英

如何在mysql中獲得每個對應月份的第一天?

[英]How to get first day of every corresponding month in mysql?

我想獲得當年每個相應月份的第一天。 例如,如果用戶選擇“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;

謝謝

這是你想要的:

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

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

實際上有一個簡單的解決方案,因為一個月的第一天就是today - (day_of_month_in_today - 1)

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

其他非常迂回和間接的方法形成對比。


此外,由於我們對時間組件不感興趣, curdate()是比now()更好(更快)的函數。 我們還可以利用subdate()的 2-arity 重載,因為它比使用intervalsubdate() 所以更好的解決辦法是:

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

這是舊的,但這可能對新的人類網絡爬蟲有幫助 XD

對於當月的第一天,您可以使用:

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

您可以使用EXTRACT來獲取您想要的日期部分:

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

這適用於分組。

我很驚訝沒有人提出類似的東西(我不知道它的性能如何):

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

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

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

使用date_format方法並檢查月份和年份

select * from table_name where date_format(date_column, "%Y-%m")="2010-06"
date_add(subdate(curdate(), interval day(?) day), interval 1 day)

改變? 對應日期

這對我來說很好用。

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

**用列名替換“添加時間”

用例:

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

  2. 如果要將列格式保留為“日期”。 (不是“文本”或“數字”)

慢(17 秒):

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

如果您不需要日期類型,這會更快:Fast (6s):

SELECT BENCHMARK(100000000, DATE_FORMAT(CURDATE(), '%Y-%m-01'));
SELECT BENCHMARK(100000000, DATE_FORMAT(current_date, '%Y-%m-01'));
SELECT LAST_DAY(date) as last_date, DATE_FORMAT(date,'%Y-%m-01') AS fisrt_date FROM table_name

日期=您的列名

計算一個月的第一天的方法有很多種,以下是我電腦上的表現(你可以在自己的電腦上試試)

獲勝者是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
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;

這不會創建全表掃描。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM