2009-10-18 5 views
4

J'ai une ligne spécifique dans ma base de données, les informations suivantes:Comparer MySQL "Time" Champ avec chaîne en PHP

data: 

    user_id  start_time  end_time 
     405  12:00:00   14:00:00 

Je l'instruction SELECT suivante:

 SELECT * 
     FROM data 
     INNER join users on users.user_id = data.user_id 
      WHERE NOT EXISTS 
      (SELECT * FROM data 
      WHERE '10:00:00' BETWEEN start_time AND end_time) 
      GROUP BY users.usrID"); 

Maintenant, Je pense que cette requête retournerait la ligne ci-dessus (l'utilisateur 405), cependant, il ne renvoie personne. (Parce que 10:00:00 n'est pas entre 12:00:00 et 14:00:00).

Fait intéressant, si je change la valeur 10:00:00 à 07:00:00, cela fonctionne très bien.

Vous ne savez pas pourquoi cela ne fonctionne pas? Dans la base de données, j'ai les champs mis en place comme TIME, et ils sont formatés comme suit: 00:00:00

Merci beaucoup!

Mise à jour:

je changé ma requête autour de ressembler à ceci:

SELECT usrID, 
     first, 
     last 
    FROM users 
WHERE user_id NOT IN (SELECT u.user_id 
         FROM `data` d, 
           `users` u 
         WHERE d.user_id = u.user_id 
          AND CAST('10:00:00' AS TIME) BETWEEN start_time AND end_time) 
ORDER BY u.user_id 

Et cela semblait faire l'affaire. Merci pour votre aide.

Répondre

1

Essayez:

SELECT * 
    FROM DATA d 
    JOIN USERS u ON u.user_id = d.user_id 
    WHERE NOT EXISTS (SELECT NULL 
         FROM DATA t 
         WHERE t.id = d.id 
         AND CONVERT('10:00:00', TIME) BETWEEN t.start_time AND t.end_time) 
GROUP BY u.usrID 

Lorsque vous obtenez BETWEEN évaluer correctement, vous auriez remarqué que vous n » est t corréler la sous-requête - juste parce qu'ils sont la même table, ne signifie pas que les deux requêtes sont liées.

+0

Salut Rexem. Vous avez raison d'avoir besoin de corréler la sous-requête. J'ai été capable de faire fonctionner cela dans un exemple très dépouillé. Cependant, il semble que je rencontre un problème lorsque je rejoins ma table d'utilisateurs.Il semble que la requête va correctement "laisser de côté" les éléments qui tombent sous 10:00:00. Cependant, si un utilisateur a '2' entrées dans la table, disons (10:00:00, 12:00:00) ET (13:00:00, 14:00:00), la requête va chercher le deuxième ensemble (parce que ce n'est pas entre 10:00:00) et retour que l'utilisateur est disponible. Comment puis-je résoudre ce problème de sorte que si la requête trouve un 10:00:00, il annulera complètement l'utilisateur? – Dodinas

+0

Peu importe, je pense que je l'ai eu. S'il vous plaît voir mon explication dans mon post original ci-dessus. – Dodinas

3

par MySQL Manuel pour between:

« Pour obtenir les meilleurs résultats lors de l'utilisation ENTRE avec des valeurs de date ou d'heure, vous devez utiliser CAST() pour convertir explicitement les valeurs du type de données souhaitées. Exemples: Si vous comparez une valeur DATETIME à deux valeurs DATE, convertissez les valeurs DATE en valeurs DATETIME Si vous utilisez une constante chaîne telle que '2001-1-1' dans une comparaison à une DATE, transtypez la chaîne en une DATE. "

Essayez:

SELECT * 
FROM data 
    INNER join users on users.user_id = data.user_id 
WHERE NOT EXISTS 
    (
    SELECT * 
    FROM data 
    WHERE CAST('10:00:00' AS TIME) BETWEEN start_time AND end_time 
    ) 
GROUP BY users.usrID 

Sans le transtypage explicite, MySQL peut être convertir les valeurs de temps à littéraux de chaîne pour la comparaison, plutôt que de convertir la chaîne littérale à une valeur de temps.

+0

Merci pour la réponse, James. J'étais certain que votre solution allait retourner cette rangée, mais elle revient toujours vide. Encore une fois, si j'entre 07:00:00, il le renvoie. – Dodinas

+0

Si quelqu'un d'autre a des idées, ce serait génial. – Dodinas

+0

'CAST ('10: 00: 00 'EN TEMPS) ENTRE start_time ET end_time' fonctionne bien pour moi, avec' CONVERT ('10: 00: 00', TIME) ', en utilisant MySQL 4.1 –

2

Je pense que ce qui se passe est que le temps '10: 00: 00 'est pris comme une chaîne, plutôt que comme un temps. Cela expliquerait pourquoi le '07: 00: 00 'donne des résultats différents. Essayez coulée la valeur à la fois ... Je pense que la syntaxe est quelque chose comme:

cast('10:00:00' as time)