Как написать код SQL, чтобы получить данные между 2 датами? - PullRequest
0 голосов
/ 21 марта 2019

У меня есть дата транзакции, и я хочу получить данные за последнюю дату вступления в силу, которые меньше или равны дате транзакции.

Вот таблица, которая у меня есть

transactiondate|effectivedate|unitprice
19-02-19       |01-01-19     | 36
19-02-19       |28-12-18     | 30
19-02-19       |15-12-18     | 20

Вот запрос, который я использовал

select A.unitprice, A.transactiondate, A.effectivedate
from A
where A.transactiondate >= A.effectivedate

и вот результат, который я получил

transactiondate|effectivedate|unitprice
19-02-19       |01-01-19     | 36
19-02-19       |28-12-18     | 30
19-02-19       |15-12-18     | 20

Но я хочу получить эти данные

transactiondate|effectivedate|unitprice
19-02-19       |01-01-19     | 36

Я использую Мой SQL-сервер. Пожалуйста, помогите мне исправить запрос, чтобы получить нужные мне данные.

Ответы [ 4 ]

0 голосов
/ 21 марта 2019

это будет работать:

select transactiondate,min(effectivedate) latest_date,unitprice 
from Table1;

проверьте это: http://sqlfiddle.com/#!9/0bc3fc/9

0 голосов
/ 21 марта 2019

Ваша главная проблема заключается в том, что ваши даты не в формате даты, распознаваемой MySQL, поэтому вам необходимо преобразовать их для сравнения. Вам также необходимо найти максимальную эффективную дату для сравнения:

SELECT A.unitprice, A.transactiondate, A.effectivedate
FROM A
WHERE STR_TO_DATE(A.effectivedate, '%d-%m-%y') =
  (SELECT MAX(STR_TO_DATE(effectivedate, '%d-%m-%y'))
   FROM A
   WHERE STR_TO_DATE(A.transactiondate, '%d-%m-%y') >= STR_TO_DATE(A.effectivedate, '%d-%m-%y'))
  AND STR_TO_DATE(A.transactiondate, '%d-%m-%y') >= STR_TO_DATE(A.effectivedate, '%d-%m-%y');

Выход:

unitprice   transactiondate effectivedate
36          19-02-19        01-01-19

Демонстрация на dbfiddle

0 голосов
/ 21 марта 2019

Прежде всего вам нужно получить максимальное количество эффективных дат по дате транзакции, а затем использовать его для получения результата.

Попробуйте следующий запрос

SELECT a.* FROM tran_date a INNER JOIN(
    SELECT transactiondate, 
    MAX(effectivedate) AS max_date 
    FROM tran_date WHERE transactiondate > effectivedate 
    GROUP BY transactiondate
) AS b 
ON a.transactiondate = b.transactiondate 
AND a.effectivedate = b.max_date

Здесь внутренний запрос возвращает максимальную эффективную дату по транзакции, а затем использует этот результат с внешним запросом

Демо

0 голосов
/ 21 марта 2019

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

select A.unitprice, A.transactiondate, A.effectivedate
from A
where A.effectivedate = (select max(effectivedate) from A)
and A.effectivedate <= A.transactiondate;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...