Выбор данных в формате мм / дд / гггг в MySQL - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть приведенная ниже структура таблицы.

Tax      |   FromDate    |   EndDate
12.32    |   12-29-2020  |   12-29-2021

Ставка налога 12,32 действительна от FromDate до EndDate. 12.32 следует выбирать, когда указывается диапазон дат, который находится между FromDate и EndDate.

. Я попытался выполнить приведенный ниже запрос, однако он не дает правильного результата при пропуске @startdate и @enddate.

SELECT Tax
FROM Table
WHERE
  DATE_FORMAT(@startDate, '%m-%d-%y') >= DATE_FORMAT(t.fromDate, '%m-%d-%y')
  AND DATE_FORMAT(@endDate, '%m-%d-%y') <=  DATE_FORMAT(t.endDate, '%m-%d-%y')  LIMIT 1;

В настоящее время я использую VARCHAR (45) в качестве типа данных для столбцов, а также для значений входных параметров. Я выбрал VARCHAR (45), потому что использование типа DATE выдает ошибку при работе с mm-dd-гггг.

Где я ошибся?

Ниже приведен пример кода.

SET @startDate = '07-29-2019';
SET @endDate = '09-29-2019';

DROP TEMPORARY TABLE IF EXISTS Dates;
CREATE TEMPORARY TABLE Dates (StartDate VARCHAR(20),EndDate VARCHAR(20),Tax INT);
INSERT INTO Dates VALUES ('06-29-2019','06-29-2020',1);

SELECT *
FROM Dates
WHERE
STR_TO_DATE(@startDate, '%m-%d-%y') <= STR_TO_DATE(EndDate, '%m-%d-%y')
AND STR_TO_DATE(@endDate, '%m-%d-%y') >= STR_TO_DATE(StartDate, '%m-%d-%y')

Согласно приведенному выше коду, он должен вернуть строку. Но он не возвращается.

1 Ответ

1 голос
/ 17 апреля 2020

Вы хотите STR_TO_DATE(), а не DATE_FORMAT(). Последний преобразует дату в заданный формат строки, тогда как первый преобразует отформатированную строку даты в дату (что, как я понимаю ваш вопрос, является тем, что вы ищете):

SELECT Tax
FROM Table
WHERE
  STR_TO_DATE(@startDate, '%m-%d-%Y') >= STR_TO_DATE(t.fromDate, '%m-%d-%Y')
  AND STR_TO_DATE(@endDate, '%m-%d-%Y') <=  STR_TO_DATE(t.endDate, '%m-%d-%Y')  
ORDER BY ?
LIMIT 1;

Обратите внимание, что Вы должны добавить предложение ORDER BY к вашему запросу, чтобы LIMIT имело смысл (в противном случае не определено, какая строка будет возвращена, если предикаты допускают несколько строк).

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

WHERE
  STR_TO_DATE(@startDate, '%m-%d-%Y') <= STR_TO_DATE(t.endDate, '%m-%d-%Y')
  AND STR_TO_DATE(@endDate, '%m-%d-%Y') >= STR_TO_DATE(t.startDate, '%m-%d-%Y')
...