/ / La cláusula Where que contiene la fecha en la declaración de MySQL no funciona - mysql, date

Donde la cláusula que contiene la fecha en la declaración de MySQL no funciona - mysql, fecha

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 № 1

Nunca 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/