在 MySQL 数据库中,我有带有YEAR
,MONTH
,DAY
列的表。
| YEAR | MONTH | DAY | VALUE |
|----------------------------|
| 2018 | 11 | 9 | 1056 |
| 2018 | 11 | 10 | 6582 |
|****************************|
| 2018 | 12 | 9 | 6892 |
| 2018 | 12 | 10 | 5987 |
|****************************|
| 2019 | 3 | 5 | 5693 |
| 2019 | 3 | 6 | 5698 |
我需要获取2个日期之间表格中的所有值。
让我们说2018-11-09
和2019-03-05
之间或2018-11-10
和2018-12-09
之间。
不幸的是,我无法将这三列合并为一个datetime
列。该表也按那三列进行分区。
列的数据类型:smallint(6)
答案 0 :(得分:2)
该查询似乎应该为您提供所需的结果。它从三列中创建一个日期字符串,然后使用STR_TO_DATE
将其转换为MySQL可以与搜索日期字符串进行比较的值。
SELECT *
FROM table1
WHERE STR_TO_DATE(CONCAT_WS('/', `DAY`, `MONTH`, `YEAR`), '%d/%m/%Y') BETWEEN '2018-11-09' AND '2019-03-05'
输出
YEAR MONTH DAY VALUE
2018 11 9 1056
2018 11 10 6582
2018 12 9 6892
2018 12 10 5987
2019 3 5 5693
答案 1 :(得分:2)
一种方法是使用诸如MySQL Date format和Concat()
之类的字符串函数在Lpad()
(YYYY-MM-DD
)中创建一个字符串:
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'