mysql - SQL:找到生成日期的公式,只是想理解它

标签 mysql sql

所以这个公式,我现在在如何快速有效地生成日期列表的问题的多个答案中都看到了它,而没有循环之类的东西。这个公式是有效的,我复制了它,测试了它,玩了它等等。问题是,我只是不明白它背后的数学原理。我讨厌使用我不理解的东西,我觉得我 A) 作弊,B) 为自己日后的问题埋下了隐患。

无论如何,这是我正在谈论的公式:

set @start_date = '2015-9-20';
set @end_date = '2016-9-20';

select @start_date + interval ((a.a) + (10 * b.a) + (100 * c.a)) day as this_date
from 
(select 0 as a
union all select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9) as a cross join
(select 0 as a
union all select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9) as b cross join
(select 0 as a
union all select 1
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9) as c;

快速注意:开始日期/结束日期的内容只适合我。我最终将把它变成一个使用这两个值来生成日期范围的过程,这里的值只是我计算出来的测试值。

所以,让我们从我理解的部分开始,然后继续讨论其他内容。

1) 联合本质上是创建 3 个 10 行表,整数值为 0-9。

2) 这 3 个表在没有指定 where 子句的情况下连接在一起,这意味着它是笛卡尔连接,并且行数呈指数增长 (10 x 10 x 10 = 1000)。

3) 日期值按天数间隔递增,该天数间隔等于 INTERVAL 语句旁边括号内的值。

4) 数学模式反射(reflect)了笛卡尔连接。第一个表的每个值乘以 1,第二个表乘以 10,第三个表乘以 100。

我不明白的是:数学本身。不知何故,通过将这些数字加在一起,结果是最终将日期值增加 1000 天的间隔。我真的很想了解为什么它有效,不仅仅是模式,而是它有效的实际数学、程序原因。

提前非常感谢。

最佳答案

您想要做的是生成两个日期之间的范围。

您通常可以使用循环 forwhile 但这不适用于普通选择,您将需要一个存储过程。

当您意识到选择生成从 0 到 999 的数字时。

因此您可以生成近 3 年的日期。你得到的是:

@start_date + 1 day
@start_date + 2 days
@start_date + 3 days
...
@start_date +  999 days

但是您的查询错过了 where 子句

WHERE @start_date + interval ((a.a) + (10 * b.a) + (100 * c.a)) <= @end_date

假设您想要创建小时范围,您需要添加另一个表以将范围增加到0.. 9999并将间隔设置为小时

DATE_ADD(@start_date, INTERVAL (a.a) + (10 * b.a) + (100 * c.a) + (1000 * d.a) HOUR) 

获取:

@start_date + 1 hour
@start_date + 2 hours
@start_date + 3 hours
...
@start_date +  9999 hours

额外说明

所有的联合创建一个派生表。该代码相当于您创建一个包含 1000 行的表并从中进行选择。

SELECT *
FROM table1000

1000 rows return

然后,使用该表上的每个值和常量 @start_date 来更改每一行

现在您有一个以 @start_date 开头的 1000 天列表

最后使用 @end_date 进行过滤,删除比您想要的日期大的日期。

关于mysql - SQL:找到生成日期的公式,只是想理解它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32556919/

相关文章:

java - 如何将 SQL 查询转换为 HQL

mysql - 如何比较 2 个 mysql 转储

sql - sp_addsrvrolemember 不授予登录权限

sql - T-SQL SELECT TOP 值和增量

php - Woocommerce - 将新订单详细信息复制到新表格

jquery - 如何编写这个查询以获得正确的结果?

mysql - SQL查询多表

mysql - MySQL 中替换字符串的问题

php - MySQL 从 IPBoard 帐户授权用户

mysql - Ruby 脚本在 sql 查询完成之前结束