l'asile.fr


Question MySQL

Le niaï qui a créé la base de données sur laquelle je travaille a séparé les champs Date et Time.
Vu que je dois faire une requête qui cherche les fichiers qui ont plus de cinq minutes, je suis embêté.

La requête qui existe (mais qui est en bois) :

SELECT * FROM LaTable WHERE
d_DispatchDate = CURDATE() AND
t_DispatchTime >= CURTIME() - 300


Le genre de requête que je voudrais faire :

SELECT * FROM LaTable WHERE
d_DispatchDate = extraire la partie 'date' de (SUBTIME( NOW, '0 0:5:0.000000')) AND
t_DispatchTime >= extraire la partie 'time' de (SUBTIME( NOW, '0 0:5:0.000000'))


Sauriez-vous comment faire ?
Y'a t'il plus simple ?

Merci.


mercredi
24 septembre 2008 à 15:35
 
 

déjà c'est faux, si 23h59 c'est toujours moins de 5 min avant 0h00 ce n'est déjà plus le même jour.

il faut coller ta date et ton heure, les transformer en timestamp UNIX_TIMESTAMP(CONCAT(d_DispatchDate, ' ', t_DispatchTime)) et faire UNIX_TIMESTAMP(CONCAT(d_DispatchDate, ' ', t_DispatchTime)) >= UNIX_TIMESTAMP(NOW()) + 300.

j'adore les timestamp unix, on doit pouvoir faire avec les timestamp directement mais j'ai la flemme


Dernière modification le 24/09/08 à 15:56 par Akshell
mercredi
24 septembre 2008 à 15:55
 
 

en MySQL 5 tu peux aussi faire :

TIMESTAMPDIFF(SECOND, CONCAT(d_DispatchDate, ' ', t_DispatchTime) , NOW()) < 300
ou
TIMESTAMPDIFF(MINUTE, CONCAT(d_DispatchDate, ' ', t_DispatchTime) , NOW()) < 5

et pour faire plus simple, tu fusionnes tes champs et tu indexes. parce que là ça va ramer un peu.


Dernière modification le 24/09/08 à 16:07 par Akshell
mercredi
24 septembre 2008 à 16:01
 
 

Merci Akshell.

Akshell a écrit
déjà c'est faux, si 23h59 c'est toujours moins de 5 min avant 0h00 ce n'est déjà plus le même jour.

Oui. C'est pour cela que je dis que c'est en bois.
Akshell a écrit
il faut coller ta date et ton heure, les transformer en timestamp UNIX_TIMESTAMP(CONCAT(d_DispatchDate, ' ', t_DispatchTime)) et faire UNIX_TIMESTAMP(CONCAT(d_DispatchDate, ' ', t_DispatchTime)) >= UNIX_TIMESTAMP(NOW()) + 300.

j'adore les timestamp unix, on doit pouvoir faire avec les timestamp directement mais j'ai la flemme

Oué, l'idée m'avait traversé l'esprit pour les timestamp unix mais j'avais pas pensé au CONCAT...

Bon. Pour l'instant ça ne marche pas. Je vais chercher pourquoi.

Akshell a écrit
en MySQL 5 tu peux aussi faire :

TIMESTAMPDIFF(SECOND, CONCAT(d_DispatchDate, ' ', t_DispatchTime) , NOW()) < 300
ou
TIMESTAMPDIFF(MINUTE, CONCAT(d_DispatchDate, ' ', t_DispatchTime) , NOW()) < 5

Je suis en 4.1 :/
Akshell a écrit
et pour faire plus simple, tu fusionnes tes champs et tu indexes. parce que là ça va ramer un peu.

Je sais. La table actuelle : non seulement elle n'a pas les champs Date et Time indexés, mais en plus elle fait dans les 7 Go. Et c'est une table mensuelle...

La ruse qu'on a trouvé est de faire aussi le SELECT d'après la valeur d'un compteur auto-increment. On a passé les requêtes de 2 minutes à 2 secondes comme ça :)

J'aurai bien regroupé les champs Date et Time, mais vu que beaucoup de processus reposent sur ce système, on m'en a dissuadé.


mercredi
24 septembre 2008 à 16:20
 
 

Y'a moyen de faire afficher des valeurs genre UNIX_TIMESTAMP(NOW()) par MySQL ou via phpMyAdmin pour débugger ?


mercredi
24 septembre 2008 à 16:24
 
 

SELECT NOW(), UNIX_TIMESTAMP(NOW());

sans rien d'autre


mercredi
24 septembre 2008 à 16:31
 
 

LeChat a écrit
Bon. Pour l'instant ça ne marche pas. Je vais chercher pourquoi.

parce que j'ai inversé le signe :/
WHERE UNIX_TIMESTAMP(CONCAT(d_DispatchDate, ' ', t_DispatchTime)) >= UNIX_TIMESTAMP(NOW()) - 300


mercredi
24 septembre 2008 à 16:34
 
 

Akshell a écrit
SELECT NOW(), UNIX_TIMESTAMP(NOW());

sans rien d'autre

Merci.

Akshell a écrit
LeChat a écrit
Bon. Pour l'instant ça ne marche pas. Je vais chercher pourquoi.

parce que j'ai inversé le signe :/
WHERE UNIX_TIMESTAMP(CONCAT(d_DispatchDate, ' ', t_DispatchTime)) >= UNIX_TIMESTAMP(NOW()) - 300

Ahem. Tu dois te dire que je suis un putain d'assisté.

Spoiler : afficher/masquer


mercredi
24 septembre 2008 à 16:38
 
 


Répondre au sujet

Vous devez être identifié pour participer à ce topic.