1

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-09and2019-03-05或介于2018-11-10and之间2018-12-09

我需要说的是,很遗憾我无法将这三列合并为一datetime列。该表还按这 3 列进行了分区。

列的数据类型:smallint(6)

4

2 回答 2

2

看来这个查询应该给你你想要的结果。它从您的 3 列中创建一个日期字符串,然后将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

dbfiddle 上的演示

于 2018-11-24T09:10:03.570 回答
2

一种方法是使用字符串函数创建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'
于 2018-11-24T09:11:23.087 回答