【SQL】如何用SQL求時間差、WHERE 篩選時間區隔

  • Post author:
Home » 莫非工具 » SQL » 【SQL】如何用SQL求時間差、WHERE 篩選時間區隔

今天的文章要跟大家分享平時在寫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內容,這邊也附上相關參考資料連結,供大家進一步查閱~

Murphy

我是Murphy,是一名職場人。這裡主要分享職場問題、職場話題、求職資訊,還有那些我所熱愛的事物。

This Post Has One Comment

歡迎留言,與我們分享你的看法!