db2 sql日期减一天 db2 sql日期加一天_sql date类型


这是一个系列文章,这个系列的理念是通过一道题,搞懂一类题。涵盖了SQL面试最常考的知识点。搞懂这些题,面试时工作中sql不可能有问题。

文章分为引入问题-完整解析-答案-leetcode题和答案-知识点拓展-BAT等大厂面试真题几个部分。

希望能帮你全方位的弄懂。有问题可以留言,码字不易,写一篇要好几个小时,希望能得到点赞收藏哦

一、问题

下面是某店铺每天的营业额,表名为“日销”。“日期”这一列的数据类型是日期类型(date)。 现在要求找出比前一天销售额高的记录。比如表中2015-01-02的营业额25万,大于2015-01-01的营业额10万。所以返回2015-01-02这一条记录。


db2 sql日期减一天 db2 sql日期加一天_sql date类型_02


二、准备


CREATE TABLE 日销 (
 Id int(11) DEFAULT NULL,
 日期 date DEFAULT NULL,
 营业额 int(11) DEFAULT NULL
);

INSERT INTO 日销 VALUES ('1','2015-01-01', '10');
INSERT INTO 日销 VALUES ('2','2015-01-02', '25');
INSERT INTO 日销 VALUES ('3','2015-01-03', '20');
INSERT INTO 日销 VALUES ('4','2015-01-04', '30');


三、解答

[解题思路]

1.确定题目需求。要求比较前后两天的营业额,如果比前一天营业额高就返回。


db2 sql日期减一天 db2 sql日期加一天_sql date类型_03


2.确定两表连接类型。这里我们看到a表1号的营业额和b表2号的营业额比较......所以这里使用两表连接。如上图,我们以b表为主,所以选择右连接。当你选择保留左表的记录时,转换成左连接。

3.确定主键。a表的2015-01-01和b表的2015-01-02比较,所以a.日期 = b.日期-1,转化下就是DATEDIFF(a.日期, b.日期) = -1。需要返回比前一天营业额大的日期,所以a.营业额 < b.营业额

[代码]


select a.ID, a.日期, a.营业额
from 日销 as a right join 日销 as b 
     on DATEDIFF(a.日期, b.日期) = 1
where a.营业额 > b.营业额;


db2 sql日期减一天 db2 sql日期加一天_sql date类型_04


[知识点讲解]

Datediff函数,时间类函数

Datediff语句的用法


DATEDIFF(date1,date2) # 返回date1 - date2的时间差


时间类函数:

  1. DATE_FORMAT (datetime ,FormatCodes ):转换日期格式
  2. EXTRACT(unit FROM date):提取日期的指定部分
  3. DAY、week、year:提取date中的日、周、年等
  4. CURRENT_X
  5. 日期加减:DATEDIFF (date1 ,date2 ) 两个日期差; TIMEDIFF(datetime1,datetime2) : 两个日期时间型相减;DATE_ADD(date2 , INTERVAL d_value d_type )在date2中加上日期或时间;DATE_SUB (date2 , INTERVAL d_value d_type )在date2上减去一个时间;

[本题答案]

[题目]

给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id。


db2 sql日期减一天 db2 sql日期加一天_sql datetime 加一天_05


[参考答案]


SELECT
    weather.id AS 'Id'
FROM
    weather
        JOIN
    weather w ON DATEDIFF(weather.date, w.date) = 1
        AND weather.Temperature > w.Temperature