/ / La clause Where contenant la date dans l'instruction MySQL ne fonctionne pas - mysql, date

Où la clause contenant la date dans l'instruction MySQL ne fonctionne pas - mysql, date

Nom de la table: DemoTable.

Nombre total de champs: 2

Des champs:

id (int, auto increment, primary key)
month_and_year (varchar(10))

month_and_year contient la date "2015-03", "2015-01", "2014-12" et ainsi de suite ...

J'essaie d'obtenir des valeurs de la table entre "2014-10" et "2015-03".

SELECT * FROM DemoTable where month_and_year>="2014-10" AND month_and_year<="2015-03" ORDER BY month_and_year DESC

La requête ne donne pas la sortie souhaitée month_and_year terrain a varchar Type de données. La modification du type de données varchar to date n’est pas possible car le type de données date n’accepte pas la date au format "aaaa-mm".

Comment peut-on obtenir le résultat?

PS: UNIX_TIMESTAMP () est-il une valeur sûre dans ce cas?

Réponses:

3 pour la réponse № 1

Vous ne devriez jamais stocker la valeur de date en tant que varchar et choisir les types de données liés à la date native mysql comme date,datetime ou timestamp

Cependant, dans votre cas, vous devez effectuer des calculs liés à la date avant de faire la requête select. Considérons le tableau suivant

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        |
+------+----------------+

Maintenant, l'approche serait aussi

Convertissez d'abord le varchar en date réelle

Ensuite, pour la limite inférieure, commencez toujours la comparaison à partir du premier jour de l'année

La limite supérieure sera jusqu'à la fin du mois.

Alors la requête devient

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 sortie sera aussi

+------+----------------+
| id   | month_and_year |
+------+----------------+
|    1 | 2014-10        |
|    2 | 2014-10        |
|    4 | 2014-11        |
|    5 | 2015-01        |
+------+----------------+

0 pour la réponse № 2

Vous devez utiliser soit mysql date time les fonctions ou utilisez int champ dans mysql et store UNIXTIMESTAMP et comparez comme vous le faites déjà. Je pense qu’il est excessif de stocker unixtimestamp parce que vous n’avez besoin que de mois et d’année et que vous ne profiterez pas beaucoup des avantages d’unixtimestamp.


0 pour la réponse № 3

Utilisez la fonction STR_TO_DATE (chaîne, format);

http://www.mysqltutorial.org/mysql-str_to_date/