如何选择2个date by year、month、day列之间的所有值?

q8l4jmvw  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(298)

在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 列。表也有3列的分区。
列的数据类型: smallint(6)

9rbhqvlz

9rbhqvlz1#

看来这个查询应该会给你想要的结果。它从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上演示

xam8gpfp

xam8gpfp2#

一种方法是创建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,则可以查看生成的列,并在 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'

相关问题