2017-06-22 1 views
3

Voici ma table: shift_masterComment obtenir changement en cours en 'heure actuelle de la base de données Mysql

shift(varchar)  | start_time(varchar) | end_time(varchar)  
Morning   | 06:00 AM   | 02:00 PM  
AfterNoon   | 02:00 PM   | 10:00 PM  
Evening   | 10:00 PM   | 06:00 AM 

J'ai besoin d'une requête dans laquelle je passerai l'heure actuelle et il donnera le compte rendu de décalage qui est actuellement en cours.

J'apprécie vraiment votre aide.

+0

Merci @Giorgos Betsos –

+0

Stockage des valeurs de temps que 'varchar' n'est pas une bonne idée. Cela rendrait les choses très simples d'utiliser le type de données 'TIME' natif de MySQL à la place. –

+0

Il s'avère que le pire dans la façon dont les équipes sont représentées est le fait que 'Evening' s'étend sur plusieurs jours. À mon humble avis, il serait beaucoup plus simple d'obtenir le résultat que vous voulez si vous avez brisé le décalage de la soirée en deux enregistrements distincts, soit 22h00-12h00 et 00h00 - 06h00 AM'. –

Répondre

0

d'abord changer votre type de données pour start_time et end_time à horodater et entrez le temps dans son format, puis

SELECT shift FROM shift_master WHERE start_time <= NOW() AND end_time > NOW(); 

Il est difficile de comparer le temps stocké sous forme varchar avec current_time. Si possible, faites comme décrit ci-dessus, cela simplifiera votre travail.

+0

Désolé @Vrajesh Doshi, notre exigence est de stocker dans 'H: I A' formate. Donc, dans l'horodatage, je ne peux pas stocker de données dans ce formulaire. –

0

Essayez d'utiliser cette

SELECT shift FROM shift_master WHERE TIME(NOW()) BETWEEN TIME(STR_TO_DATE(start_time,'%h:%i %p')) AND TIME(STR_TO_DATE(end_time,'%h:%i %p')) 
+0

Merci pour votre réponse. C'est vrai quand l'heure actuelle est inférieure à 22:00:00. Mais mon heure actuelle est 23:00:00 alors le résultat devrait être 'Soir'. Mais dans votre requête, je n'ai rien. –

0

Essayez cette requête

set @now_time = UNIX_TIMESTAMP(now()) % 86400; 

SELECT shift 
FROM (SELECT shift, UNIX_TIMESTAMP(STR_TO_DATE(start_time,'%h:%i %p')) % 86400 as start, UNIX_TIMESTAMP(STR_TO_DATE(end_time,'%h:%i %p')) % 86400 as end 
FROM shift_master) M 
WHERE (start < end AND @now_time BETWEEN start AND end - 1) OR 
(start > end AND (@now_time > start or @now_time < end)) 
+0

Désolé, ça ne fonctionne pas yaar –

+0

@PHPDev Quelle est la sortie de cette requête pour vous? – MahdiY

+0

Je n'ai pas d'enregistrement, donc la structure de la table est en train de s'afficher. –