天天看点

MySQL 日期函数之 DATEDIFF

前言

刷题过程中,发现有关日期的加减尤其频繁,频繁程度仅次于之前的工资谁高的问题。不得不细细的想,为啥呢?是爱么?是希望么?当然不是啊,是效率。最终的最终,要归结为效率,毕竟终极目标都是为了赚小钱钱!

DATEDIFF 函数简介

DATEDIFF() 函数返回两个日期之间的天数,通俗的讲就是计算时间差。

DATEDIFF() 函数语法格式为:

DATEDIFF(date1,date2)
           

得到的结果就是 date1 与 date2 相差的天数,如果 date1 比 date2 大,则结果为正,反之则为负。

注意:只有日期值部分参与计算!!!

DATEDIFF 函数实例

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

+---------+------------------+------------------+              | Id(INT) | RecordDate(DATE) | Temperature(INT) |              +---------+------------------+------------------+              |       1 |       2015-01-01 |               15 |              |       2 |       2015-01-02 |               26 |              |       3 |       2015-01-03 |               21 |              |       4 |       2015-01-04 |               34 |              +---------+------------------+------------------+              #例如,根据上述给定的 Weather 表格,返回如下 Id:              +----+              | Id |              +----+              |  2 |              |  4 |              +----+                ​​​​​​      
SELECT B.Id              FROM Weather AS A              CROSS JOIN Weather AS B               ON DATEDIFF(A.RecordDate,B.RecordDate)=-1              WHERE A.Temperature < B.Temperature;
           

逻辑解析

  • 中心思想:交叉联结
  • 首先,将一个表命名 A 和 B ,变成两个表
  • 其次,找到 A 表中日期比 B 表中日期小一天的数据
  • 再次,找到满足上述条件时,A 表的温度比 B 表的温度小的数据
  • 最后,再组合一下子就好了嘛

其他解题方法​​​​​​​

SELECT B.Id              FROM Weather AS A              CROSS JOIN Weather AS B               ON TIMESTAMPDIFF(DAY,A.RecordDate,B.RecordDate)=1              WHERE A.Temperature < B.Temperature;
           

注意:TIMESTAMPDIFF() 的规则同 DATEDIFF() 的规则不同~且更加温婉细腻!

继续阅读