Mysql 如何按年、月、日列选择2个日期之间的所有值?
在MySQL数据库中,我有一个带有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
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有更新吗?它到底行不行?