前言
刷題過程中,發現有關日期的加減尤其頻繁,頻繁程度僅次于之前的工資誰高的問題。不得不細細的想,為啥呢?是愛麼?是希望麼?當然不是啊,是效率。最終的最終,要歸結為效率,畢竟終極目标都是為了賺小錢錢!
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() 的規則不同~且更加溫婉細膩!