> For the complete documentation index, see [llms.txt](https://houzidata.gitbook.io/sql/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://houzidata.gitbook.io/sql/di-3-zhang-duo-biao-cha-xun/tu-jie-mian-shi-ti-ru-he-bi-jiao-ri-qi-shu-ju.md).

# 图解面试题：如何比较日期数据？

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUiGAM0sJJpLgDLupE5%2F-MUiGfKC-FE4FsNXZAzR%2F%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%E6%97%A5%E6%9C%9F%E6%95%B0%E6%8D%AE_1.webp?alt=media\&token=28509a38-f9dc-400c-9101-6d70ea73b2cf)

**【题目】**

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

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUsPRUNjAQ_NgCIICAQ%2F-MUsPZyX0lJMfXae2a7A%2F%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%E6%97%A5%E6%9C%9F%E6%95%B0%E6%8D%AE_2.webp?alt=media\&token=a8e88c34-42d3-489a-8214-0d085b61a15e)

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

例如需要返回一下结果：

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUsPRUNjAQ_NgCIICAQ%2F-MUsPeKNJ51CFXGzDjZX%2F%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%E6%97%A5%E6%9C%9F%E6%95%B0%E6%8D%AE_3.webp?alt=media\&token=e6bd6485-cd64-4fc6-9a69-336876886147)

**【解题思路】**

1.交叉联结

首先我们来复习一下之前课程《从零学会 sql》里讲过的交叉联结（corss join）的概念。

使用交叉联结会将两个表中所有的数据两两组合。如下图，是对表 “text” 自身进行交叉联结的结果：

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUsPRUNjAQ_NgCIICAQ%2F-MUsPjODK7BgElprYxk6%2F%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%E6%97%A5%E6%9C%9F%E6%95%B0%E6%8D%AE_4.webp?alt=media\&token=8c39a6eb-95d6-4250-b9cd-4a037871aefb)

直接使用交叉联结的业务需求比较少见，往往需要结合具体条件，对数据进行有目的的提取，本题需要结合的条件就是 “前一天”。

2.本题的日销表交叉联结的结果（部分）如下。这个交叉联结的结果表，可以看作左边三列是表 a，右边三列是表 b。

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUsPRUNjAQ_NgCIICAQ%2F-MUsPmfaDjHC4cbvYIlc%2F%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%E6%97%A5%E6%9C%9F%E6%95%B0%E6%8D%AE_5.webp?alt=media\&token=71d61b79-8089-4d0a-8b2a-b82103dfe1a3)

红色框中的每一行数据，左边是 “当天” 数据，右边是 “前一天” 的数据。比如第一个红色框中左边是 “当天” 数据（2 号），右边是 “前一天” 的数据（1 号）。

题目要求，销售额条件是：“当天” > “昨天”（前一天）。所以，对于上面的表，我们只需要找到表 a 中销售额（当天）大于 b 中销售额（昨天）的数据。

3.另一个需要着重去考虑的，就是如何找到 “昨天”（前一天），这里为大家介绍两个时间计算的函数：

> datediff(日期 1, 日期 2)：
>
> 得到的结果是日期 1 与日期 2 相差的天数。
>
> 如果日期 1 比日期 2 大，结果为正；如果日期 1 比日期 2 小，结果为负。

例如：日期 1（2019-01-02），日期 2（2019-01-01），两个日期在函数里互换位置，就是下面的结果

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUsPRUNjAQ_NgCIICAQ%2F-MUsQJhBQbGdReCPqsk6%2F%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%E6%97%A5%E6%9C%9F%E6%95%B0%E6%8D%AE_6.png?alt=media\&token=ef5db404-c571-4311-b17f-5dc2e0e0407f)

另一个关于时间计算的函数是：

> timestampdiff(时间类型, 日期 1, 日期 2)
>
> 这个函数和上面 diffdate 的正、负号规则刚好相反。
>
> 日期 1 大于日期 2，结果为负，日期 1 小于日期 2，结果为正。

在 “时间类型” 的参数位置，通过添加 “day”, “hour”, “second” 等关键词，来规定计算天数差、小时数差、还是分钟数差。示例如下图：

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUsPRUNjAQ_NgCIICAQ%2F-MUsPxqzUGkeHDjMZLtp%2F%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%E6%97%A5%E6%9C%9F%E6%95%B0%E6%8D%AE_7.png?alt=media\&token=3a8ed9a3-a4a1-4e7f-b6c1-cebdbda206b7)

**【解题步骤】**

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

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUsPRUNjAQ_NgCIICAQ%2F-MUsQ-ti1viduzIcSuig%2F%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%E6%97%A5%E6%9C%9F%E6%95%B0%E6%8D%AE_8.jpg?alt=media\&token=76f7cf0f-6c69-49a4-97b9-970631214ffe)

**2. 选出上图红框中的 “a. 日期比 b. 日期大一天”**

可以使用 “diffdate(a. 日期, b. 日期) = 1” 或者“timestampdiff(day, a. 日期, b. 日期) = -1”，以此为基准，提取表中的数据，这里先用 diffdate 进行操作。

代码部分：

```sql
select *
from 日销 as a cross join 日销 as b 
     on datediff(a.日期, b.日期) = 1;
```

得到结果：

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUsPRUNjAQ_NgCIICAQ%2F-MUsQVkIFoWwlhS7dx9Y%2F%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%E6%97%A5%E6%9C%9F%E6%95%B0%E6%8D%AE_9.jpg?alt=media\&token=2f378c71-c35e-4ffe-aa0c-f1dec1453f8c)

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

where a. 销售额（万元） > b. 销售额（万元）

得到结果：

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUsPRUNjAQ_NgCIICAQ%2F-MUsQnaOaWiY9qQCCpZe%2F%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%E6%97%A5%E6%9C%9F%E6%95%B0%E6%8D%AE_10.webp?alt=media\&token=acede78f-3b45-421e-8c7b-c5d4ad0c28fb)

**4. 删掉多余数据**

题目只需要找销售额大于前一天的 ID、日期、销售额，不需要上表那么多数据。所以只需要提取中上表的 ID、日期、销售额（万元）列。

结合一开始提到的两个处理时间的方法，最终答案及结果如下：

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

或者

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

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUsPRUNjAQ_NgCIICAQ%2F-MUsQxgL6GYJixR9sYR2%2F%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%E6%97%A5%E6%9C%9F%E6%95%B0%E6%8D%AE_11.webp?alt=media\&token=5d2f1f35-a841-4012-a3ab-4f346e174e7c)

**【本题考点】**

1）考察逻辑思维能力，可以使用课程《分析方法》中的逻辑树分析方法将复杂问题拆解成一个一个可以解决的子问题

2）考察多表联结

3）针对时间的处理语句是在业务中经常用到的，需要熟练掌握。

4） 尤其考察对不同 sql 数据格式处理的掌握程度

**【举一反三】**

下面是气温表，名为 weather，date 列的数据格式为 date，请找出比前一天温度更高的 ID 和日期

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUsTG6UcyKGVE8QIOM6%2F-MUsTLsNxLTOj2GB0COD%2F%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%E6%97%A5%E6%9C%9F%E6%95%B0%E6%8D%AE_12.webp?alt=media\&token=afa21d9a-4009-4e39-87c8-9164187e3d1a)

参考答案：

```sql
select a.ID, a.date
from weather as a cross join weather as b 
     on datediff(a.date, b.date) = 1
where a.temp > b.temp;
```

或者：

```sql
select a.ID, a.date
from weather as a cross join weather as b 
     on timestampdiff(day, a.date, b.date) = -1
where a.temp > b.temp;
```

得到结果：

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUsTG6UcyKGVE8QIOM6%2F-MUsTQy3b-NVGbHzcJM4%2F%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%E6%97%A5%E6%9C%9F%E6%95%B0%E6%8D%AE_13.webp?alt=media\&token=43eb49ac-b435-47bc-afef-f3af9b9ba18a)

推荐：[如何从零学会人工智能必备技能：数据库和 sql？](http://mp.weixin.qq.com/s?__biz=MzAxMTMwNTMxMQ==\&mid=2649247566\&idx=2\&sn=5af748b677eb72028764dde0577675fb\&chksm=835fc77eb4284e68e8cfe3f08c5a671b9e080b2651f20b40b1c793ffda4042ae43ad8f35a755\&scene=21#wechat_redirect)

![](https://4109408004-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MTuZ3PxkXf2a7UbRybW%2F-MUsTG6UcyKGVE8QIOM6%2F-MUsTVzXDYuhXV9PY4nV%2F%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%E6%97%A5%E6%9C%9F%E6%95%B0%E6%8D%AE_14.webp?alt=media\&token=876b9bad-56f6-445d-8715-fc45be1f4970)
