天天看點

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() 的規則不同~且更加溫婉細膩!

繼續閱讀