Проблема с проверкой времени между 2 столбцами

#mysql

#mysql

Вопрос:

У меня возникла проблема при поиске 1 раз между 2 разными столбцами, возможно, я делаю что-то не так. У меня есть 2 разных сценария

 Working for this one
    time_from '06:00:00'
    time_to '18:00:00'

Not working for this one
    time_from '18:00:00'
    time_to '06:00:00'
  

Потому что, когда дело дошло до between 18:00:00 AND 06:00:00 изменения даты, пока я не добавляю даты в базу данных.

 CAST('05:12:16' AS TIME)
    BETWEEN CAST(time_from AS TIME) 
    AND CAST(time_to AS TIME)
  

Пожалуйста, помогите мне с этим.

Обновление Первый запрос работает.

 SELECT `users`.`id` as `job_user_id`, `services`.`id` as `job_service_id`, `job_surge_settings`.`time_from`,
`job_surge_settings`.`time_to`, `jobs`.`lat`, `jobs`.`lon`
FROM `services`
LEFT JOIN `services_equipments` ON `services_equipments`.`service_id` = `services`.`id`
LEFT JOIN `service_provider_equipments` ON `service_provider_equipments`.`equipment_id` = `services_equipments`.`id`
LEFT JOIN `users` ON `users`.`id` = `service_provider_equipments`.`user_id`
LEFT JOIN `jobs` ON `jobs`.`user_id` = `users`.`id`
LEFT JOIN `baskets_equipments` ON `baskets_equipments`.`equipment_id` = `services_equipments`.`id`
LEFT JOIN `baskets` ON `baskets`.`id` = `baskets_equipments`.`basket_id`
LEFT JOIN `job_surge_settings` ON `job_surge_settings`.`basket_id` = `baskets`.`id`
LEFT JOIN `state_taxes` ON `state_taxes`.`id` = `job_surge_settings`.`state_tax_id`
WHERE `services`.`id` = 4
AND `users`.`id` = 2
AND `job_surge_settings`.`id` IS NOT NULL
AND '09:52:12' BETWEEN job_surge_settings.time_from AND job_surge_settings.time_to
GROUP BY `baskets`.`name`
  

И этот запрос не работает, когда время меняется на 05:52:12

 SELECT `users`.`id` as `job_user_id`, `services`.`id` as `job_service_id`, `job_surge_settings`.`time_from`,
`job_surge_settings`.`time_to`, `jobs`.`lat`, `jobs`.`lon`
FROM `services`
LEFT JOIN `services_equipments` ON `services_equipments`.`service_id` = `services`.`id`
LEFT JOIN `service_provider_equipments` ON `service_provider_equipments`.`equipment_id` = `services_equipments`.`id`
LEFT JOIN `users` ON `users`.`id` = `service_provider_equipments`.`user_id`
LEFT JOIN `jobs` ON `jobs`.`user_id` = `users`.`id`
LEFT JOIN `baskets_equipments` ON `baskets_equipments`.`equipment_id` = `services_equipments`.`id`
LEFT JOIN `baskets` ON `baskets`.`id` = `baskets_equipments`.`basket_id`
LEFT JOIN `job_surge_settings` ON `job_surge_settings`.`basket_id` = `baskets`.`id`
LEFT JOIN `state_taxes` ON `state_taxes`.`id` = `job_surge_settings`.`state_tax_id`
WHERE `services`.`id` = 4
AND `users`.`id` = 2
AND `job_surge_settings`.`id` IS NOT NULL
AND '05:52:12' BETWEEN job_surge_settings.time_from AND job_surge_settings.time_to
GROUP BY `baskets`.`name`
  

Из-за второго сценария второй запрос не возвращает данные, не могли бы вы помочь мне исправить мой запрос, я пытался использовать IF , но мне не удалось.

Ответ №1:

Сценарий 1: когда time_from меньше, чем time_to

 CAST('05:12:16' AS TIME)
    BETWEEN CAST(time_from AS TIME) 
    AND CAST(time_to AS TIME)
  

Сценарий 2: когда time_from больше, чем time_to

 CAST('05:12:16'AS TIME) >= CAST(time_from  AS TIME) 
OR CAST('05:12:16' AS TIME) < CAST(time_to AS TIME)
  

Теперь, как уже было сказано.

  • Если вы храните время без даты в базе данных, тогда нет необходимости вводить приведение.
  • Также, если вы передаете входной параметр только в формате time, который эквивалентен mysql, нет необходимости вводить его также.
  • Также вы можете выполнить IF условие, чтобы сделать его единым.

Обновление: поэтому замените

 AND '05:52:12' BETWEEN job_surge_settings.time_from AND job_surge_settings.time_to
  

с

 AND IF(job_surge_settings.time_from > job_surge_settings.time_to, 
          '05:12:16' >= job_surge_settings.time_from OR '05:12:16' < job_surge_settings.time_to, 
          '05:12:16' BETWEEN job_surge_settings.time_from AND job_surge_settings.time_to
      )
  

Комментарии:

1. Спасибо, за ваш ответ, я пытался, но все же у меня ничего не получается. Я обновляю свой запрос в своем вопросе, можете ли вы, пожалуйста, проверить это и сделать это правильно?

2. итак, у вас есть два столбца в базе time_from данных amp; time_to ? и вы выполняете поиск с использованием пользовательского ввода? это так? Для лучшего понимания вы должны включить структуру таблицы и некоторые примеры входных данных.

3. Ну, я присоединяюсь к множеству таблиц, включая структуру таблицы, будет очень сложно, но для лучшего понимания, как вы сказали, у меня есть 2 столбца, time_from amp; time_to и я ищу, используя пользовательский ввод. Входные данные — это, скажем, просто время. Я обновил свой вопрос, пожалуйста, проверьте запрос там, вы это лучше поймете.

4. о, если это так, проверьте мой последний обновленный запрос и попробуйте его в вашем предложении where.

5. Вы спасаете жизнь, большое вам спасибо