Условие между датами не работает в SQL Server

У меня есть данные, как показано ниже,

Условие между датами не работает в SQL Server

Пытается выполнить запрос ниже, но возвращает 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 находится на 1 день раньше диапазона в выделенной строке, а 2018-04-11 - на 1 день позже. Следовательно, ни одно из утверждений не является истинным, поэтому весь оператор where возвращает false для выделенной строки. Чтобы лучше объяснить, первый BETWEEN переводится как ScheduleStartDate <= 2018-04-05 <= ScheduleEndDate, что не соответствует действительности. То же самое и со вторым заявлением BETWEEN.

MK_ 13.04.2018 07:42
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
161
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Это происходит потому что

'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')
      )

Может быть, ответ Йогеша Шармы сделает то, что вы хотите.

Sergey Menshov 13.04.2018 07:47

Еще я добавил один вариант. Проверьте это тоже.

Sergey Menshov 13.04.2018 07:52

получил решение от ответа Йогеша Шармы. Ваш ответ тоже работает. Спасибо

Santosh Jadi 13.04.2018 08:41
Ответ принят как подходящий

Вы могли бы переписать как:

select * 
from Flt_OperativeFlight_SchedulePeriods 
where CarrierCode='SQ' and FlightNumber='0004' and
      (ScheduleStartDate >= '2018-04-05' and ScheduleEndDate <= '2018-04-11')

Работает абсолютно нормально;)

Santosh Jadi 13.04.2018 08:39

Вы можете попробовать это

SELECT * 
FROM `Flt_OperativeFlight_SchedulePeriods` 
WHERE ScheduleStartDate >= '2018-04-05' AND ScheduleEndDate <= '2018-04-11' 
      AND CarrierCode='SQ' and FlightNumber='0004'

Это альтернативный подход, но не ответ

Ubercool 13.04.2018 08:15

Работает абсолютно нормально;)

Santosh Jadi 13.04.2018 08:42

Похоже, вы хотите получить перекрывающиеся периоды, тогда вам нужна такая логика:

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)
) 

В зависимости от вашей логики вам может потребоваться < или >

Другие вопросы по теме