今天的文章要跟大家分享平時在寫SQL時,遇到需要表達時間範圍時常用到的語法。這些情境包含:從X月X號到Y月Y號、過去兩個月、一年前等等。
由於時間的表達有多種方式,建議大家可以根據自己平時寫code的習慣,或是挑選對自己最有幫助的用法。
方法一:DATE() + BETWEEN 篩日期
首先,想跟大家介紹最基礎的時間篩選寫法,這也是我日常工作中最常使用的一種。
假設題目想求出 2023/01/01~ 2023/03/01 每天的GMV(營業額),寫成SQL語法如下:
SELECT grass_date, sum(gmv) gmv
FROM gmv_mart
WHERE grass_date BETWEEN DATE('2023-01-01') AND DATE('2023-03-31')
在上述語法中,我們以十分直觀的方式,用 BETWEEN 的寫法根據題目所指定的日期來進行篩選。
方法二:DATE_ADD() 求時間區隔
假設題目想看從今天算起,過去60天的 GMV 總和,若使用方法一來寫 WHERE 你會發現十分不便。這時候就可以使用 DATE_ADD(unit, value, timestamp)函數來改善這樣的情況。
寫成SQL語法如下:
SELECT SUM(gmv) gmv
FROM gmv_mart
WHERE grass_date >= DATE_ADD('day', -60, current_date)
在上面DATE_ADD函數中,我們在unit中放入的是’day’,這邊你也可以根據需求放入’second'(秒), ‘hour’ (小時), ‘month'(月), ‘year'(年)。
*備註:current_date 指的是當天的日期
方法三:DATE_DIFF() 求時間差
如果今天題目要求出30歲以上的用戶,他們在過去30天內在網站購買的GMV總額。不過資料中只有生日(birthday)欄位而沒有年齡,這時該怎麼做呢?
「30歲以上」代表今天的日期與生日兩者的差為30年以上。這時候就可以使用 DATE_DIFF(unit, timestamp1, timestamp2)函數來求時間差的部分。
寫成 SQL 語法如下:
SELECT SUM(gmv) gmv
FROM gmv_mart
WHERE grass_date >= DATE_ADD('day', -30, current_date)
AND DATE_DIFF('year', birthday, current_date) >= 30
DATE_DIFF函數中的unit同DATE_ADD函數,可以根據自己的需求放入時間單位。,而後面兩個欄位timestamp分別代表我們想取差值的時間,這裡要特別注意,DATE_DIFF函數會用後面的時間欄位(timestamp2) 扣除前面的時間欄位(timestamp1)來取差值喔!
補充:INTERVAL 用法
在寫SQL的過程中,如果遇到計算時間的問題,就可以使用 INTERVAL 來連結日期與時間。INTERVAL的表達式如下:
INTERVAL expr unit
假設我們要求昨天的GMV總額,寫成SQL如下:
SELECT SUM(gmv) gmv
FROM gmv_mart
WHERE grass_date = current_date - interval '1' day
在上面的語法中,我們使用了INTERVAL來連結今天的日期與 ‘ 1 ‘ 天的時間。(如果沒有使用INTERVAL式跑不出來結果的喔)
那麼,以上是本篇文章想跟大家分享與日期有關的SQL內容,這邊也附上相關參考資料連結,供大家進一步查閱~
Pingback: 莫非工具 | 文章導覽 - 墨菲莫非