在 MySQL 中使用 mm/dd/yyyy 格式选择数据
Selecting data using mm/dd/yyyy format in MySQL
我有下面的 table 结构。
Tax | FromDate | EndDate
12.32 | 12-29-2020 | 12-29-2021
税率 12.32 在 FromDate
至 EndDate
期间有效。指定 FromDate
和 EndDate
之间的日期范围时应选择 12.32。
我尝试了下面的查询,但是当通过 @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) 作为列的 DataType 以及输入参数值。我选择了 VARCHAR(45),因为在处理 mm-dd-yyyy 时使用 DATE 类型会引发错误。
我哪里做错了?
下面是示例代码。
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')
根据上面的代码,应该return一行。但它不是 returning。
你想要 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')
我有下面的 table 结构。
Tax | FromDate | EndDate
12.32 | 12-29-2020 | 12-29-2021
税率 12.32 在 FromDate
至 EndDate
期间有效。指定 FromDate
和 EndDate
之间的日期范围时应选择 12.32。
我尝试了下面的查询,但是当通过 @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) 作为列的 DataType 以及输入参数值。我选择了 VARCHAR(45),因为在处理 mm-dd-yyyy 时使用 DATE 类型会引发错误。
我哪里做错了?
下面是示例代码。
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')
根据上面的代码,应该return一行。但它不是 returning。
你想要 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')