一种方法是使用字符串函数创建MySQL 日期格式( YYYY-MM-DD) 的字符串,例如Concat()和Lpad():
SELECT *
FROM your_table
WHERE CONCAT(`YEAR`, '-', LPAD(`MONTH`,2,'0'), '-', LPAD(`DAY`,2,'0'))
BETWEEN '2018-11-09' AND '2019-03-05'
根据评论中的进一步讨论,如果您可以为给定的数据范围分别输入年、月和日值;我们可以直接使用相应的列,而不是使用函数创建日期。这也将允许我们在这些列上使用索引(如果已定义)。
SELECT *
FROM your_table
WHERE
/* Condition for the month in the start date of the range */
(YEAR = 2018 AND MONTH = 11 AND DAY >= 9)
OR
/* Condition for the rest of the months in start date year */
(YEAR = 2018 AND MONTH > 11)
OR
/* Condition for the month in the end date of the range */
(YEAR = 2019 AND MONTH = 3 AND DAY <= 5)
OR
/* Condition for the rest of the months in end date year */
(YEAR = 2019 AND MONTH < 3)
OR
/* Condition for the years between the start and end date */
(YEAR > 2018 AND YEAR < 2019)
上述条件可以进一步压缩。但是我是这样写的,为了便于理解。
但是,建议创建另一个列以日期格式存储日期。如果您无法更改应用程序代码,并且您的 MySQL 版本 >= 5.7,您可以查看Generated Columns,并在SELECT查询中引用它。
ALTER TABLE your_table
ADD COLUMN date_col DATE
GENERATED ALWAYS AS CONCAT(`YEAR`, '-', LPAD(`MONTH`,2,'0'), '-', LPAD(`DAY`,2,'0')) STORED;
然后,SELECT查询变得微不足道:
SELECT * FROM your_table
WHERE date_col BETWEEN '2018-11-09' AND '2019-03-05'