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;
28
demandé sur TGuimond 2010-10-18 18:12:31

5 réponses

Vous pouvez utiliser STR_TO_DATE () fonction.

32
répondu Sachin Shanbhag 2010-10-18 14:19:15

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';
40
répondu Joe Holt 2013-12-23 15:57:15

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.

17
répondu Spudley 2010-10-18 14:56:44

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 :)

1
répondu zod 2010-10-18 14:17:30

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)

0
répondu Gannet 2018-04-18 22:15:50