Запрос MYSQL между поведением даты

#mysql #sql #date #datetime #where-clause

#mysql #sql #Дата #datetime #where-предложение

Вопрос:

У меня есть запрос следующим образом:

 SELECT * FROM  tbl_invoice_header
WHERE Create_Date BETWEEN '2019-04-01' AND '2020-03-31'
AND Auth_Settle_Date >'2020-03-31';
  

Я хочу получить все данные между диапазоном дат, но это было решено после 2020-03-31

Он возвращает мне строку, в которой Auth_Settle_Date=2020-03-31 14:24:36

Auth_Settle_Date — это столбцы даты и времени, поэтому я предполагаю, что именно поэтому он возвращается

Что, я думаю, правильно, как и после 2020-03-31, но не та функциональность, которую я искал

На основе предыдущих комментариев, если я использую: ГДЕ Create_Date МЕЖДУ ‘2019-04-01’ И ‘2020-03-31’ И Auth_Settle_Date> ‘2020-03-31’ ;

он возвращает мне 9 строк:

Если я использую: ГДЕ create_date >= ‘2019-03-01’ И create_date <‘2020-04-01’ И auth_settle_date >= ‘2020-04-01’

или

ГДЕ create_date >= ‘2019-03-01’ И create_date <‘2020-04-01’ И auth_settle_date >= ‘2020-03-31’ ИНТЕРВАЛ 1 ДЕНЬ

он возвращает 10 записей

где, как представляется, фактический правильный запрос:

ГДЕ Create_Date МЕЖДУ ‘2019-04-01’ И ‘2020-03-31’ И Auth_Settle_Date >= ‘2020-04-01’

Так что, я думаю, кажется, мне придется добавить день вне запроса к дате to, прежде чем я передам его в запрос, просто кажется странным

Поскольку это возвращает правильные 8 строк

Ответ №1:

Это единственный способ получить функциональность для добавления 1 дня к указанной дате

Да, это правильный способ сделать это. Я бы также рекомендовал использовать полуоткрытые интервалы create_date , если у него также есть временная часть:

 where create_date >= '2019-03-01' 
  and create_date <  '2020-04-01' 
  and auth_settle_date >= '2020-04-01'
  

Примечание: я полагаю, что вы имели '2019-03-01' в виду, а не '2019-04-01' как нижнюю границу create_date интервала (в противном случае запрос несколько бессмыслен).

Если даты поступают извне вашего кода в качестве параметров запроса, вы можете добавить 1 день непосредственно в запрос:

 where create_date >= :start_date
  and create_date <  :end_date   interval 1 day
  and auth_settle_date >= :end_date   interval 1 day
  

Ответ №2:

вы можете использовать INtervall для этого

 SELECT * FROM  tbl_invoice_header
WHERE Create_Date BETWEEN '2019-04-01' AND '2020-03-31'
AND Auth_Settle_Date > '2020-03-31'   INTERVAL 1 DAY;