Mysql 如何按年、月、日列选择2个日期之间的所有值?

Mysql 如何按年、月、日列选择2个日期之间的所有值?,mysql,Mysql,在MySQL数据库中,我有一个带有YEAR、MONTH、DAY列的表 | YEAR | MONTH | DAY | VALUE | |----------------------------| | 2018 | 11 | 9 | 1056 | | 2018 | 11 | 10 | 6582 | |****************************| | 2018 | 12 | 9 | 6892 | | 2018 | 12 | 10 | 5987

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)

似乎此查询应该提供您想要的结果。它从您的3列中创建一个日期字符串,然后使用它将其转换为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

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

一种方法是使用字符串函数(
YYYY-MM-DD
)在中创建字符串,如和:


根据评论中的进一步讨论,如果可以分别输入给定数据范围的年、月和日值;我们可以直接使用相应的列,而不是使用函数创建日期。这还允许我们在这些列上使用索引(如果定义的话)

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)
然后,
SELECT
查询变得很简单:

SELECT * FROM your_table
WHERE date_col BETWEEN '2018-11-09' AND '2019-03-05'

一种方法是使用以下字符串函数在(
YYYY-MM-DD
)中创建字符串:


根据评论中的进一步讨论,如果可以分别输入给定数据范围的年、月和日值;我们可以直接使用相应的列,而不是使用函数创建日期。这还允许我们在这些列上使用索引(如果定义的话)

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)
然后,
SELECT
查询变得很简单:

SELECT * FROM your_table
WHERE date_col BETWEEN '2018-11-09' AND '2019-03-05'


为自己省下一个痛苦的世界,并使用适当的数据类型存储日期。为什么一天有时是9,有时是0,05。这三列的数据类型是什么?我不想详细介绍,但我有很多原因不能做到这一点。我知道对一个datetime列使用
BETWEEN
运算符更容易,但这里的问题并不是这个。@MadhurBhaiya这是我的错。事实上,它必须是
5
,而不是
05
。没有零。我编辑我的帖子。你可以再查一遍。这些列的类型是
smallint(6)
See CONCAT-但老实说,更好的办法是看到构建此模式的人被解雇,然后你可以自由地重新设计它。省去你自己的痛苦,并使用适当的数据类型存储日期为什么有时是9天,有时是用0,05填充。这三列的数据类型是什么?我不想详细介绍,但我有很多原因不能做到这一点。我知道对一个datetime列使用
BETWEEN
运算符更容易,但这里的问题并不是这个。@MadhurBhaiya这是我的错。事实上,它必须是
5
,而不是
05
。没有零。我编辑我的帖子。你可以再查一遍。这些列的类型是
smallint(6)
See CONCAT-但老实说,更好的办法是看到构建此模式的人被解雇,然后你可以自由地重新设计它。谢谢你的回答!您的代码返回结果,但问题是速度。例如,每周切片处理时间为25秒,我认为这太长了。正如我所说的,这3列有分区。是否可以分别获取每天的数据,然后将它们全部合并。事实上,在我的真实表格中,许多记录都是同一天、同一个月、同一年。差异仅在“值”列中显示。你对此有什么想法吗?谢谢你的回答!您的代码返回结果,但问题是速度。例如,每周切片处理时间为25秒,我认为这太长了。正如我所说的,这3列有分区。是否可以分别获取每天的数据,然后将它们全部合并。事实上,在我的真实表格中,许多记录都是同一天、同一个月、同一年。差异仅在“值”列中显示。你对此有什么想法吗?谢谢你的回答!不幸的是,我无法更改表的结构。您的代码返回结果,但问题是速度。处理的时间太长了。事实上,在我的真实表格中,许多记录都是同一天、同一个月、同一年。差异仅在“值”列中显示。正如我所说的,这3列有分区。是否可以分别获取每天的数据,然后将它们全部合并。你对此有什么想法吗?@NurzhanNogerbek在你的表格上分享索引详细信息。从您的输入日期(例如,
2018-11-09
)中,您能否提取日期、月份和年份,并将其作为查询的输入?是的,我可以。作为输入,如果可以解决我的问题,我可以分别发送年、月、日值,而不是
2018-11-09
。你有什么想法吗?@NurzhanNogerbek有更新吗?它是否有效?谢谢你的回答!不幸的是,我无法更改表的结构。您的代码返回结果,但问题是速度。处理的时间太长了。事实上,在我的真实表格中,许多记录都是同一天、同一个月、同一年。差异仅在“值”列中显示。正如我所说的,这3列有分区。是否可以分别获取每天的数据,然后将它们全部合并。你对此有什么想法吗?@NurzhanNogerbek在你的表格上分享索引详细信息。从您的输入日期(例如,
2018-11-09
)中,您能否提取日期、月份和年份,并将其作为查询的输入?是的,我可以。作为输入,如果可以解决我的问题,我可以分别发送年、月、日值,而不是
2018-11-09
。你有什么想法吗?@NurzhanNogerbek有更新吗?它到底行不行?