#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. Вы спасаете жизнь, большое вам спасибо