¿Cómo obtener el primer día de cada mes correspondiente en mysql?

Quiero obtener el primer día de cada mes correspondiente del año actual. Por ejemplo, si el usuario selecciona ‘2010-06-15’, la consulta exige ejecutarse desde ‘2010-06-01’ en lugar de ‘2010-06-15’.

Por favor, ayúdame a calcular el primer día de la fecha seleccionada. Actualmente, estoy tratando de ser deseable utilizando la siguiente consulta de selección de mysql:

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

Gracias

Es esto lo que estás buscando:

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

Puede usar la función LAST_DAY proporcionada por MySQL para recuperar el último día de cualquier mes, eso es fácil:

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

Regresará:

 2010-06-30 

Desafortunadamente, MySQL no proporciona ninguna función FIRST_DAY para recuperar el primer día de un mes (no estoy seguro de por qué). Pero dado el último día, puede agregar un día y restar un mes para obtener el primer día. Por lo tanto, puedes definir una función personalizada:

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

De esa manera:

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

Regresará:

 2010-06-01 

En realidad, hay una solución sencilla ya que el primer día del mes es simplemente today - (day_of_month_in_today - 1) :

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

Contraste eso con los otros métodos que son extremadamente indirectos e indirectos.


Además, dado que no estamos interesados ​​en el componente de tiempo, curdate() es una función mejor (y más rápida) que now() . También podemos aprovechar la subdate() de 2 subdate() de subdate() ya que es más subdate() que usar el interval . Entonces una mejor solución es:

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

Esto es antiguo, pero esto podría ser útil para los nuevos rastreadores web humanos XD

Para el primer día del mes actual, puede usar:

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

Puede usar EXTRACT para obtener las partes de fecha que desea:

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

Esto funciona bien para agrupar.

Puede usar la función DATE_FORMAT () para obtener el primer día de cualquier campo de fecha.

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

Cambie Curdate () con cualquier otro campo de Fecha como:

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

Luego, usando tu propia pregunta:

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

Puede cambiar CURDATE () con cualquier otra fecha dada.

use el método date_format y verifique solo mes y año

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

Estoy sorprendido de que nadie haya propuesto algo parecido a esto (no sé cuán eficiente es):

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

Se podrían realizar operaciones de fecha adicionales para eliminar el formato, si es necesario

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

cambiar el ? para la fecha correspondiente

Esto funciona bien para mi.

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

** reemplazar “Tiempo agregado” con el nombre de la columna

Casos de uso:

  1. Si desea restablecer todos los campos de fecha, excepto Mes y Año .

  2. Si desea conservar el formato de columna como “fecha”. (no como “texto” o “número”)

Lento (17s): SELECCIONE BENCHMARK (100000000, current_date – INTERVAL (día (fecha_actual) -1) DÍA); SELECCIONE BENCHMARK (100000000, cast (DATE_FORMAT (current_date, ‘% Y-% m-01’) como fecha));

Si no necesita un tipo de fecha, esto es más rápido: Rápido (6s): SELECCIONE BENCHMARK (100000000, DATE_FORMAT (CURDATE (), ‘% Y-% m-01’)); SELECCIONE 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; 

Esto no creará un escaneo de tabla completo.