У меня есть данные, как показано ниже,
Пытается выполнить запрос ниже, но возвращает 0 строк, Запрос ниже должен возвращать выделенные данные строки, как показано выше.
Кто-нибудь, пожалуйста, объясните мне, что мне не хватает?
select * from Flt_OperativeFlight_SchedulePeriods
where
(
(cast('2018-04-05' as date) between cast(ScheduleStartDate as date) and cast(ScheduleEndDate as date) )
or
(cast('2018-04-11' as date) between cast(ScheduleStartDate as date) and cast(ScheduleEndDate as date) )
)
and CarrierCode='SQ' and FlightNumber='0004'


Это происходит потому что
'2018-04-05' < '2018-04-06'
and
'2018-04-11' > '2018-04-10'
Как вариант, может быть, это то, что вы хотите
select *
from Flt_OperativeFlight_SchedulePeriods
where CarrierCode='SQ' and FlightNumber='0004' and
(
(ScheduleStartDate between '20180405' and '20180411')
or (ScheduleEndDate between '20180405' and '20180411')
)
Может быть, ответ Йогеша Шармы сделает то, что вы хотите.
Еще я добавил один вариант. Проверьте это тоже.
получил решение от ответа Йогеша Шармы. Ваш ответ тоже работает. Спасибо
Вы могли бы переписать как:
select *
from Flt_OperativeFlight_SchedulePeriods
where CarrierCode='SQ' and FlightNumber='0004' and
(ScheduleStartDate >= '2018-04-05' and ScheduleEndDate <= '2018-04-11')
Работает абсолютно нормально;)
Вы можете попробовать это
SELECT *
FROM `Flt_OperativeFlight_SchedulePeriods`
WHERE ScheduleStartDate >= '2018-04-05' AND ScheduleEndDate <= '2018-04-11'
AND CarrierCode='SQ' and FlightNumber='0004'
Это альтернативный подход, но не ответ
Работает абсолютно нормально;)
Похоже, вы хотите получить перекрывающиеся периоды, тогда вам нужна такая логика:
start_1 <= end_2 and end_1 >= start_2
По вашему запросу:
where
(
cast('2018-04-05' as date) <= cast(ScheduleEndDate as date)
and
cast('2018-04-11' as date) >= cast(ScheduleStartDate as date)
)
В зависимости от вашей логики вам может потребоваться < или >
Ваш
2018-04-05находится на 1 день раньше диапазона в выделенной строке, а2018-04-11- на 1 день позже. Следовательно, ни одно из утверждений не является истинным, поэтому весь оператор where возвращает false для выделенной строки. Чтобы лучше объяснить, первыйBETWEENпереводится какScheduleStartDate <= 2018-04-05 <= ScheduleEndDate, что не соответствует действительности. То же самое и со вторым заявлениемBETWEEN.