如何比较日期数据?

1、题目

下面是某公司每天的营业额,表名为“日销”。“日期”这一列的数据类型是日期类型(date)。


日销.png

请找出所有比前一天(昨天)营业额更高的数据。(前一天的意思,如果“当天”是1月,“昨天”(前一天)就是1号)

例如需要返回一下结果:


返回结果.png

2、解题思路

  1. 交叉联结
    使用交叉联结会将两个表中所有的数据两两组合。如下图,是对表“text”自身进行交叉联结的结果:
    \color{red}{在Mysql中}\color{red}{inner} \color{red}{join=} \color{red}{cross} \color{red}{join =} \color{red}{join}
    交叉联结.png

    直接使用交叉联结的业务需求比较少见,往往需要结合具体条件,对数据进行有目的的提取,本题需要结合的条件就是“前一天”。
  2. 本题的日销表交叉联结的结果(部分)如下。这个交叉联结的结果表,可以看作左边三列是表a,右边三列是表b。
    交叉联结部分结果图

    红色框中的每一行数据,左边是“当天”数据,右边是“前一天”的数据。比如第一个红色框中左边是“当天”数据(2号),右边是“前一天”的数据(1号)。
    题目要求,销售额条件是:“当天” > “昨天”(前一天)。所以,对于上面的表,我们只需要找到表a中销售额(当天)大于b中销售额(昨天)的数据。
    3.另一个需要着重去考虑的,就是如何找到 “昨天”(前一天),这里为大家介绍两个时间计算的函数:
    \color{red}{(1)datediff(日期1, 日期2):得到的结果是日期1与日期2相差的天数。}
    \color{red}{如果日期1比日期2大,结果为正;如果日期1比日期2小,结果为负。}
    例如:日期1(2019-01-02),日期2(2019-01-01),两个日期在函数里互换位置,就是下面的结果:
    datediff例子.png

    \color{red}{(2)timestampdiff(时间类型, 日期1, 日期2)}
    这个函数和上面diffdate的正、负号规则刚好相反。日期1大于日期2,结果为负,日期1小于日期2,结果为正。
    在“时间类型”的参数位置,通过添加“day”, “hour”, “second”等关键词,来规定计算天数差、小时数差、还是分钟数差。示例如下图:
    timestampdiff例子.png

3、解题步骤

1.将日销表进行交叉联结

select * from 日销 a inner join 日销 b;

  1. 选出“ a.日期比b.日期大一天”

可以使用“datediff(a.日期, b.日期) = 1”或者“timestampdiff(day, a.日期, b.日期) = -1”,以此为基准,提取表中的数据。

select * from 日销 a inner join 日销 b on datediff(a.日期,b.日期)=1;
select * from 日销 a inner join 日销 b on timestampdiff(day,a.日期,b.日期)=-1;

得到的结果:


结果图.png

3.找出a中销售额大于b中销售额的数据

\color{red}{where} \color{red}{a.销售额(万元) > b.销售额(万元)}
或者
\color{red}{ and} \color{red}{a.销售额(万元) > b.销售额(万元)}

4.删掉多余数据

题目只需要找销售额大于前一天的ID、日期、销售额,不需要上表那么多数据。所以只需要提取中上表的ID、日期、销售额(万元)列。
结合一开始提到的两个处理时间的方法,最终答案及结果如下:

select a.ID, a.日期, a.销售额(万元)
from 日销 as a cross join 日销 as b
on datediff(a.日期, b.日期) = 1
where a.销售额(万元) > b.销售额(万元);

或者

select a.ID, a.日期, a.销售额(万元)
from 日销 as a cross join 日销 as b
on timestampdiff(day, a.日期, b.日期) = -1
where a.销售额(万元) > b.销售额(万元);

5.最终答案


最终答案.png

6.测试结果
经过测试,Date_SUB执行效率最快,datediff速度比timestampdiff快。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容