php - name - ¿Cómo obtengo el mes a partir de la fecha en mysql?
mysql get month name from date (7)
Quiero poder obtener resultados de mysql con una declaración como esta:
SELECT *
FROM table
WHERE amount > 1000
Pero quiero obtener el resultado restringido a un determinado mes y año (según la información del usuario) ... Lo intenté así:
SELECT *
FROM table
WHERE amount > 1000
AND dateStart = MONTH(''$m'')
... $m
siendo un mes pero dio error.
En esa tabla, en realidad tiene dos fechas: startDate
y endDate
pero me estoy enfocando en startDate
. Los valores de entrada serían mes y año. ¿Cómo formulo la declaración SQL que obtiene los resultados en función de ese mes de ese año?
Intente esto si (el campo de fecha es texto y luego convierta esta cadena en fecha):
SELECT * FROM `table_name` WHERE MONTH(STR_TO_DATE(date,''%d/%m/%Y''))=''11''
//This will give month number MONTH(STR_TO_DATE(date,''%d/%m/%Y''))
//If its return 11 then its November
// Change date format with your date string format %d/%m/%Y
P.ej
$date = sprintf("''%04d-%02d-01''", $year, $month);
$query = "
SELECT
x,y,dateStart
FROM
tablename
WHERE
AND amount > 1000
AND dateStart >= $date
AND dateStart < $date+Interval 1 month
";
mysql_query($query, ...
Esto creará una consulta como por ejemplo
WHERE
AND amount > 1000
AND dateStart >= ''2010-01-01''
AND dateStart < ''2010-01-01''+Interval 1 month
+ Interval 1 month
es una alternativa a date_add() .
SELECT Date(''2010-01-01''+Interval 1 month)
-> 2010-02-01
SELECT Date(''2010-12-01''+Interval 1 month)
-> 2011-01-01
De esta manera siempre obtendrá el primer día del mes siguiente. Los registros que desea deben tener una fecha de inicio antes de esa fecha pero después / igual al primer día del mes (y año) que ha pasado a sprintf ().
''2010-01-01''+Interval 1 month
no cambia entre filas. MySQL calculará el término solo una vez y puede utilizar índices para la búsqueda.
Prueba esto
SELECT *
FROM table
WHERE amount > 1000
AND MONTH(datestart)
GROUP BY EXTRACT(YEAR_MONTH FROM datestart)
Prueba esto:
SELECT *
FROM table
WHERE amount > 1000 AND MONTH(dateStart) = MONTH(''$m'') AND YEAR(dateStart) = YEAR(''$m'')
Trabaja en: MySQL 5.7, MySQL 5.6, MySQL 5.5, MySQL 5.1, MySQL 5.0, MySQL 4.1, MySQL 4.0, MySQL 3.23
Día:
SELECT EXTRACT(DAY FROM "2017-06-15");
Mes:
SELECT EXTRACT(MONTH FROM "2017-06-15");
Año:
SELECT EXTRACT(YEAR FROM "2017-06-15");
Utilice la función month()
.
select month(now());
startDate
cerca - obtuvo la comparación al revés (asumiendo que startDate
es un tipo de datos DATETIME o TIMESTAMP):
SELECT *
FROM table
WHERE amount > 1000
AND MONTH(dateStart) = {$m}
Advertencias:
- mysql_escape_string cuenta que está utilizando mysql_escape_string o corre el riesgo de ataques de inyección de SQL .
- Las llamadas a funciones en columnas significan que un índice, si existe, no se puede usar
Alternativas:
Debido a que el uso de funciones en columnas no puede usar índices, un mejor enfoque sería usar BETWEEN
y las funciones STR_TO_DATE
:
WHERE startdate BETWEEN STR_TO_DATE([start_date], [format])
AND STR_TO_DATE([end_date], [format])
Consulte la documentación para formatear la sintaxis.