MySQL получает записи между определенным месяцем, годом

У меня есть таблица Accounts, в которой есть столбец даты с именем TransactionDate. Мне нужно получить все записи, где TransactionDate находится между месяцем и годом.

Например, все записи, где TransactionDate находится между 6 2016 и 8 2017.

Моя строка запроса выглядит так:

SELECT Amount 
  FROM Accounts 
 WHERE (MONTH(TransactionDate) BETWEEN 6 and 8) 
   AND (YEAR(TransactionDate) BETWEEN 2016 and 2017)  
 ORDER BY TransactionDate ASC

Однако он дает мне записи только за июнь, июль 2016 г. и август 2017 г. Он пропускает записи за январь 2017 г., спет, ноябрь 2016 г.

Прикрепляю скриншот столбца TransactionDate всех записей (их 31)

введите здесь описание изображения

Вот скриншот возвращенного результата

введите здесь описание изображения

Что не так с моим запросом? Также этот запрос будет динамическим, т.е. пользователи будут выбирать месяц и год из формы, и им будет возвращен результат.

Спасибо.


person codeinprogress    schedule 08.08.2017    source источник
comment
Этот вывод основан на вводе, которое вы показываете, и запросе, который вы запускаете.   -  person RiggsFolly    schedule 08.08.2017


Ответы (5)


Вы просто фильтруете запросы по тем, которые ДО 2017-08 и ПОСЛЕ 2016-06.

SELECT Amount 
  FROM Accounts 
 WHERE TransactionDate > '2016-06-01T00:00:00' 
   AND TransactionDate < '2017-08-01T00:00:00' 
 ORDER BY TransactionDate ASC

что не так с вашим текущим запросом, так это то, что вы получаете данные, где месяц — июнь, июль или август, И где год — 2016 или 2017. Это неправильно, вы хотите фильтровать по самой дате, а не по ней. компоненты.

person Aidan Connelly    schedule 08.08.2017

Казалось бы, вы хотите:

select a.Amount
from Accounts a
where a.TransactionDate >= '2016-06-01' AND
      a.TransactionDate < '2017-09-01'
order by a.TransactionDate ASC
person Gordon Linoff    schedule 08.08.2017

select Amount from Accounts where TransactionDate  BETWEEN '2016-04-02' AND '2017-08-03';

попробуй это, удачи

person Jok3r    schedule 08.08.2017

Я думаю, это то, что вам нужно

SELECT Amount , ExpenseType , 
      MONTHNAME(TransactionDate) AS TransactionMonthString
      Year(TransactionDate) AS TransactionYearString
FROM Accounts 
WHERE TransactionDate >= '2016-06-01' AND TransactionDate <= '2017-08-01'   
ORDER BY TransactionDate
person Ali Faris    schedule 08.08.2017

Вы можете сделать это легко, используя функцию date_format mysql.

 SELECT 
     Amount
 FROM
     Accounts
 WHERE
     DATE_FORMAT(TransactionDate, '%Y-%m') BETWEEN '2016-06' AND '2017-08' ORDER BY TransactionDate ASC;

Это должно работать отлично.

person Jay Momaya    schedule 07.01.2020