Snowflake 提供了多樣化的日期和時間函式,讓資料工程師能更有效率地處理時間資料。date_trunc() 函式可以將日期截斷到指定的單位,像是取得某日期的年初、月初或季初。dateadd() 函式則可以將日期加減指定的單位,例如計算一個月後的日期,同時也會自動處理閏年等特殊情況。dayname() 和 monthname() 函式能分別取得日期的星期名稱和月份名稱,方便在報表或分析中呈現更易讀的資訊。date_part() 函式則可以提取日期或時間的特定部分,例如年、月、日、時、分、秒等,方便進行更細緻的分析。datediff() 函式則可以計算兩個日期之間的差值,單位可以是年、月、日、小時等,方便計算時間間隔。此外,Snowflake 也支援多種日期格式的自動轉換,使用 CAST() 函式或 TO_DATE() 函式能將字串轉換成日期格式,簡化資料處理流程。這些函式的組合應用,能讓資料工程師更靈活地處理各種時間相關的需求,提升資料分析的效率和準確性。
時間魔法:玄貓解密 Snowflake 的日期與時間函式
在資料分析的旅程中,時間就像一位難以捉摸的精靈,時而快速流逝,時而靜止不動。身為資料工程師,我們經常需要操控時間,從中提取有用的資訊。今天,玄貓就帶大家深入 Snowflake 的日期與時間函式,讓你也能成為時間魔法師。
時間的起點:date_trunc() 函式
在處理時間資料時,有時我們需要將日期截斷到特定的時間單位,例如年份、月份或季度。這時候,date_trunc() 函式就派上用場了。
舉例來說,假設我們有一個日期 2023-05-26,想要知道該日期所屬的年份、月份和季度的起始日期,可以使用以下 SQL 語法:
SELECT
date_trunc('YEAR', dt.val) AS start_of_year,
date_trunc('MONTH', dt.val) AS start_of_month,
date_trunc('QUARTER', dt.val) AS start_of_quarter
FROM (VALUES (TO_DATE('26-MAY-2023', 'DD-MON-YYYY'))) AS dt(val);
內容解密:
date_trunc('YEAR', dt.val):將日期截斷到年份,傳回該年份的第一天。date_trunc('MONTH', dt.val):將日期截斷到月份,傳回該月份的第一天。date_trunc('QUARTER', dt.val):將日期截斷到季度,傳回該季度的第一天。TO_DATE('26-MAY-2023', 'DD-MON-YYYY'):將字串轉換為日期格式。
執行結果如下:
+---------------+----------------+------------------+
| START_OF_YEAR | START_OF_MONTH | START_OF_QUARTER |
|---------------+----------------+------------------|
| 2023-01-01 | 2023-05-01 | 2023-04-01 |
+---------------+----------------+------------------+
時間的推移:dateadd() 函式
有時候,我們需要將日期向前或向後移動一段時間。這時候,dateadd() 函式就能滿足我們的需求。
例如,將三個不同的日期都加上一個月:
SELECT
dateadd(month, 1, TO_DATE('01-JAN-2024', 'DD-MON-YYYY')) AS date1,
dateadd(month, 1, TO_DATE('15-JAN-2024', 'DD-MON-YYYY')) AS date2,
dateadd(month, 1, TO_DATE('31-JAN-2024', 'DD-MON-YYYY')) AS date3;
內容解密:
dateadd(month, 1, date):將date加上一個月。
執行結果如下:
+------------+------------+------------+
| DATE1 | DATE2 | DATE3 |
|------------+------------+------------|
| 2024-02-01 | 2024-02-15 | 2024-02-29 |
+------------+------------+------------+
值得注意的是,當我們將 2024-01-31 加上一個月時,結果是 2024-02-29,因為 2024 年是閏年。
再看一個例子,將日期倒退一年:
SELECT dateadd(year, -1, TO_DATE('29-FEB-2024', 'DD-MON-YYYY')) AS new_date;
內容解密:
dateadd(year, -1, date):將date減去一年。
執行結果如下:
+------------+
| NEW_DATE |
|------------|
| 2023-02-28 |
+------------+
由於 2023 年不是閏年,因此 2024-02-29 倒退一年變成了 2023-02-28。
時間的姓名:dayname() 和 monthname() 函式
有時候,我們需要提取日期中的星期名稱或月份名稱。dayname() 和 monthname() 函式可以幫助我們實作這個目標。
SELECT dayname(current_date), monthname(current_date);
內容解密:
dayname(date):傳回date的星期名稱。monthname(date):傳回date的月份名稱。current_date:傳回目前的日期。
執行結果如下:
+-----------------------+-------------------------+
| DAYNAME(CURRENT_DATE) | MONTHNAME(CURRENT_DATE) |
|-----------------------+-------------------------|
| Sun | Nov |
+-----------------------+-------------------------+
時間的數字:date_part() 函式
date_part() 函式可以提取日期中的各種時間單位,例如年份、季度、月份、星期、小時、分鐘、秒和奈秒。
SELECT
date_part(year, dt.val) AS year_num,
date_part(quarter, dt.val) AS qtr_num,
date_part(month, dt.val) AS month_num,
date_part(week, dt.val) AS week_num
FROM (VALUES(TO_DATE('24-APR-2023', 'DD-MON-YYYY'))) AS dt(val);
內容解密:
date_part(unit, date):提取date中的unit時間單位。
執行結果如下:
+----------+---------+-----------+----------+
| YEAR_NUM | QTR_NUM | MONTH_NUM | WEEK_NUM |
|----------+---------+-----------+----------|
| 2023 | 2 | 4 | 17 |
+----------+---------+-----------+----------+
提取時間:
SELECT
date_part(hour, dt.val) AS hour_num,
date_part(minute, dt.val) AS min_num,
date_part(second, dt.val) AS sec_num,
date_part(nanosecond, dt.val) AS nsec_num
FROM (VALUES(current_timestamp)) AS dt(val);
內容解密:
current_timestamp:傳回目前的日期和時間。
執行結果如下:
+----------+---------+---------+----------+
| HOUR_NUM | MIN_NUM | SEC_NUM | NSEC_NUM |
|----------+---------+---------+----------|
| 18 | 33 | 9 | 87000000 |
+----------+---------+---------+----------+
時間的距離:datediff() 函式
datediff() 函式可以計算兩個日期之間的時間差,單位可以是年份、月份、天數、小時等等。
SELECT
datediff(year, dt.val1, dt.val2) AS num_years,
datediff(month, dt.val1, dt.val2) AS num_months,
datediff(day, dt.val1, dt.val2) AS num_days,
datediff(hour, dt.val1, dt.val2) AS num_hours
FROM (VALUES (TO_DATE('12-FEB-2022', 'DD-MON-YYYY'), TO_DATE('06-MAR-2023', 'DD-MON-YYYY'))) AS dt(val1, val2);
內容解密:
datediff(unit, date1, date2):計算date1和date2之間的時間差,單位為unit。
執行結果如下:
+-----------+------------+----------+-----------+
| NUM_YEARS | NUM_MONTHS | NUM_DAYS | NUM_HOURS |
|-----------+------------+----------+-----------|
| 1 | 13 | 387 | 9288 |
+-----------+------------+----------+-----------+
如果將日期順序顛倒,結果會是負數:
SELECT
datediff(year, dt.val1, dt.val2) AS num_years,
datediff(month, dt.val1, dt.val2) AS num_months,
datediff(day, dt.val1, dt.val2) AS num_days,
datediff(hour, dt.val1, dt.val2) AS num_hours
FROM (VALUES (TO_DATE('06-MAR-2023', 'DD-MON-YYYY'), TO_DATE('12-FEB-2022', 'DD-MON-YYYY'))) AS dt(val1, val2);
執行結果如下:
+-----------+------------+----------+-----------+
| NUM_YEARS | NUM_MONTHS | NUM_DAYS | NUM_HOURS |
|-----------+------------+----------+-----------|
| -1 | -13 | -387 | -9288 |
+-----------+------------+----------+-----------+
如果我們只想知道時間差的絕對值,可以使用 abs() 函式:
SELECT abs(datediff(day, TO_DATE('06-MAR-2023', 'DD-MON-YYYY'), TO_DATE('12-FEB-2022', 'DD-MON-YYYY'))) AS num_days;
時間的變身:日期轉換
Snowflake 提供了多種函式,用於在不同的資料型別之間進行轉換。在處理日期資料時,我們經常需要將字串轉換為日期格式。to_date() 函式和 cast() 函式都可以實作這個目標。
SELECT
CAST('23-SEP-2023' AS DATE) AS format1,
CAST('09/23/2023' AS DATE) AS format2,
CAST('2023-09-23' AS DATE) AS format3;
內容解密:
CAST(string AS DATE):將字串轉換為日期格式。
執行結果如下:
+------------+------------+------------+
| FORMAT1 | FORMAT2 | FORMAT3 |
|------------+------------+------------|
| 2023-09-23 | 2023-09-23 | 2023-09-23 |
+------------+------------+------------+
Snowflake 可以自動識別多種日期格式,但如果格式無法識別,就會丟擲錯誤。
總而言之,Snowflake 提供了豐富的日期與時間函式,讓我們可以輕鬆地操控時間資料,從中提取有用的資訊。掌握這些函式,你也能成為時間魔法師,在資料分析的道路上更進一步。