如何按年,月,日列在2个日期之间选择所有值?

时间:2018-11-24 08:34:28

标签: mysql

MySQL 数据库中,我有带有YEARMONTHDAY列的表。

| 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-092019-03-05之间或2018-11-102018-12-09之间。

不幸的是,我无法将这三列合并为一个datetime列。该表也按那三列进行分区。

列的数据类型:smallint(6)

2 个答案:

答案 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

Demo on dbfiddle

答案 1 :(得分:2)

一种方法是使用诸如MySQL Date formatConcat()之类的字符串函数在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'