mysql - 如何在日期类型的两列之间获取数据
问题描述
我有一个用于存储事件数据的表,其中包含以下两个条目
id | title | startdate | enddate
1 | event1 | 2019-04-01 | 2019-04-04
2 | event2 | 2019-04-04 | 2019-04-05
我需要编写一个查询来获取数据
id| title | date
1 | event1 | 2019-04-01
1 | event1 | 2019-04-02
1 | event1 | 2019-04-03
1 | event1 | 2019-04-04
1 | event2 | 2019-04-04
1 | event2 | 2019-04-05
请提出任何查询。
请用mysql查询。
解决方案
可以通过创建一个日期约为 273 年的表来解决您的问题。下面的查询创建表:
CREATE TABLE test2 AS
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9);
CREATE TABLE calendar AS
select adddate('1900-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) sdate
from test2 t0,test2 t1,test2 t2,test2 t3,test2 t4;
您可以更改和增加的日历表范围:
MIN(sdate) MAX(sdate) 1900-01-01 2173-10-15
使用上表,您可以生成所需范围之间的日期。下面的查询给出了您的解决方案:
SELECT id,title,c.sdate as "date"
FROM test t
INNER JOIN calendar c
ON c.sdate BETWEEN t.startdate AND t.enddate;
输出:
id title date
1 event1 2019-04-01
1 event1 2019-04-02
1 event1 2019-04-03
1 event1 2019-04-04
2 event2 2019-04-04
2 event2 2019-04-05
对于演示,请点击以下链接:
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=6ebd669acae67d23cb5b6b9d04c86a10
推荐阅读
- javascript - Vue.js - 有条件地分配一个 CSS 类
- c# - 两台计算机之间的 C# Sockets 通信
- javascript - Gmail 插件使用文本输入创建单选组
- swiftui - HStack NavigationLink 在 Form 可点击区域小
- javascript - JavaScript 参数在箭头函数中使用但未在本地范围内的任何位置声明 - Twilio 函数
- javascript - 将 TypeScript 与 NodeJS 和 Express 结合使用
- javascript - 当 2D 数组中的元素在 react native expo 中发生变化时重新渲染页面
- android - 使用 NoActionBar 主题时显示操作栏
- flutter - 使用 Firebase 托管部署的 Flutter Web 不尊重 Safari 中的刷新
- android-studio - 当我尝试添加两个editext时,应用程序不断崩溃