Créer des champs date du jour, mois, année dans MySQL
je suis en train de développer une application qui affiche les documents et permet aux membres de rechercher ces documents par un certain nombre de paramètres différents, l'un d'entre eux étant la plage de date.
le problème que j'ai est que le schéma de base de données n'a pas été développé par moi-même et le créateur de la base de données a créé une table de "date" avec des champs pour "Jour", "Mois", "Année".
je voudrais savoir comment je peux sélectionner un jour, mois, année à partir de la table et de créer un objet date en SQL pour que je puisse comparer les dates saisies par l'utilisateur en utilisant entre.
ci-Dessous est la structure de la table:
CREATE TABLE IF NOT EXISTS `date` (
`deposition_id` varchar(11) NOT NULL default '',
`day` int(2) default NULL,
`month` int(2) default NULL,
`year` int(4) default NULL,
PRIMARY KEY (`deposition_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
5 réponses
lorsque vous avez des valeurs entières pour l'année, le mois et le jour, vous pouvez faire une DATETIME en combinant MAKEDATE() et DATE_ADD(). MAKEDATE () avec un jour constant de 1 vous donnera une DATETIME pour le premier jour de l'année donnée, et ensuite vous pouvez y ajouter le mois et le jour avec DATE_ADD ():
mysql> SELECT MAKEDATE(2013, 1);
+-------------------+
| MAKEDATE(2013, 1) |
+-------------------+
| 2013-01-01 |
+-------------------+
mysql> SELECT DATE_ADD(MAKEDATE(2013, 1), INTERVAL (3)-1 MONTH);
+---------------------------------------------------+
| DATE_ADD(MAKEDATE(2013, 1), INTERVAL (3)-1 MONTH) |
+---------------------------------------------------+
| 2013-03-01 |
+---------------------------------------------------+
mysql> SELECT DATE_ADD(DATE_ADD(MAKEDATE(2013, 1), INTERVAL (3)-1 MONTH), INTERVAL (11)-1 DAY);
| DATE_ADD(DATE_ADD(MAKEDATE(2013, 1), INTERVAL (3)-1 MONTH), INTERVAL (11)-1 DAY) |
+----------------------------------------------------------------------------------+
| 2013-03-11 |
+----------------------------------------------------------------------------------+
alors pour répondre à la question de L'OP:
SELECT * FROM `date`
WHERE DATE_ADD(DATE_ADD(MAKEDATE(year, 1), INTERVAL (month)-1 MONTH), INTERVAL (day)-1 DAY)
BETWEEN '2013-01-01' AND '2014-01-01';
pour construire une chaîne de date sortable à partir de cela, vous aurez besoin de CONCAT
pour joindre les morceaux ensemble et LPAD
pour s'assurer que les champs du mois et du jour sont de deux chiffres. Quelque chose comme ceci:
CONCAT(`year`,'-',LPAD(`month`,2,'00'),'-',LPAD(`day`,2,'00'))
une fois que vous avez cela, vous devriez pouvoir utiliser BETWEEN
, car ils seront dans un format sortable. Cependant, si vous avez encore besoin de les convertir en champs datetime réels, vous pouvez envelopper le tout dans UNIX_TIMESTAMP()
pour obtenir une valeur d'horodatage.
alors vous finiriez avec quelque chose comme ceci:
SELECT UNIX_TIMESTAMP(CONCAT(`year`,'-',LPAD(`month`,2,'00'),'-',LPAD(`day`,2,'00'))) as u_date
WHERE u_date BETWEEN timestamp_1 and timestamp_2
Toutefois, sachez que ce sera massivement plus lent que si le champ n'était qu'un simple horodatage. Et vous devez absolument vous assurer d'avoir un index sur les champs année, mois et jour.
essayez D'utiliser CONCAT () et faites-en un champ et comparez .
Je ne suis pas sûr que vous pouvez le comparer comme date après la concaténation.
vous pouvez comparer comme entier.
concatinent Année Mois Jour et faire un entier comme ce 20101017 et comparer.
Espérons-le :)
la façon La plus simple de le faire est:
DATE(CONCAT_WS('-', year, month, day))
la DACL n'est pas nécessaire comme @pbarney l'a souligné plus tôt. Si vous comparez avec un autre objet date, il n'est pas strictement nécessaire de l'envelopper avec DATE car MySQL le lancera automatiquement:
some_date_field > CONCAT_WS('-', year, month, day)