Nombre de la tabla: DemoTable
.
Campos Totales: 2
Campos:
id (int, auto increment, primary key)
month_and_year (varchar(10))
month_and_year
contiene la fecha como "2015-03", "2015-01", "2014-12" y así sucesivamente ...
Estoy tratando de obtener valores de la tabla entre "2014-10" y "2015-03".
SELECT * FROM DemoTable where month_and_year>="2014-10" AND month_and_year<="2015-03" ORDER BY month_and_year DESC
La consulta no da salida deseada como month_and_year
campo tiene varchar
tipo de datos. El cambio de varchar al tipo de datos de fecha no es posible, ya que el tipo de datos de fecha no acepta la fecha en formato "aaaa-mm".
¿Cómo se puede obtener el resultado?
PD: ¿Es UNIX_TIMESTAMP () una apuesta segura en este caso?
Respuestas
3 para la respuesta № 1Nunca debe almacenar el valor de fecha como varchar y elegir los tipos de datos relacionados con la fecha nativa de mysql como date
,datetime
o timestamp
Sin embargo, en su caso, debe realizar algunos cálculos relacionados con la fecha antes de realizar la consulta de selección. Considere la siguiente tabla
mysql> select * from test ;
+------+----------------+
| id | month_and_year |
+------+----------------+
| 1 | 2014-10 |
| 2 | 2014-10 |
| 3 | 2014-09 |
| 4 | 2014-11 |
| 5 | 2015-01 |
| 6 | 2014-08 |
+------+----------------+
Ahora el enfoque lo haría como
Primero convierte el varchar a fecha real
Luego, para el límite inferior, siempre comience la comparación desde el primer mes del año, el valor del mes.
El límite superior será hasta el final del mes.
Así que la consulta se convierte en
select * from test
where
date_format(
str_to_date(
month_and_year,"%Y-%m"
),"%Y-%m-01"
)
>=
date_format(
str_to_date("2014-10","%Y-%m"
),"%Y-%m-01"
)
and
last_day(
date_format(
str_to_date(month_and_year,"%Y-%m"
),"%Y-%m-01"
)
)
<=
last_day(
date_format(
str_to_date("2015-03","%Y-%m"
),"%Y-%m-01"
)
);
La salida será como
+------+----------------+
| id | month_and_year |
+------+----------------+
| 1 | 2014-10 |
| 2 | 2014-10 |
| 4 | 2014-11 |
| 5 | 2015-01 |
+------+----------------+
0 para la respuesta № 2
Debes usar ya sea mysql date time funciones o usar el campo int en mysql y almacenar UNIXTIMESTAMP
y compara lo que ya estás haciendo. Creo que es excesivo almacenar unixtimestamp porque solo necesitas mes y año y no te beneficiarás mucho de las ventajas de unixtimestamp.
0 para la respuesta № 3
Utilice la función STR_TO_DATE (cadena, formato);
http://www.mysqltutorial.org/mysql-str_to_date/