week - 指令碼與圖表函數
此函數會傳回根據 ISO 8601 代表週數的整數。週數是根據標準數字解譯,從運算式的日期解譯計算所得。
語法:
week(timestamp [, first_week_day [, broken_weeks [, reference_day]]])
週數計數開始於 1 月 1 日 (這是因為預設會設定 Qlik Sense 以使用中斷的週)。第一週結束於 FirstWeekDay 系統變數前的日子,無論該週出現多少天。FirstWeekDay 系統變數可在 week() 函數內以 first_week_day 引數取代。
week() 函數也會提供說明是否透過 broken_weeks 引數使用中斷或未中斷的週的功能。如果採用中斷週功能,第 1 週必須包含 1 月的特定天數,如 ReferenceDay 系統變數所定義。因此,第 1 週有可能開始於 12 月,或者,第 52 或 53 週可能延續至 1 月。最後,reference_day 引數允許函數覆寫 ReferenceDay 系統變數。
不同於 weekname() 函數,week() 函數也不會傳回年份值。這允許彙總比較各年份的週。
此函數內可使用 4 種引數。
引數 1:時間戳記
這是要轉換的時間戳記或解析為時間戳記的運算式的日期,例如「2012-10-12」。
引數 2:first_week_day
如果您未指定 first_week_day,則變數 FirstWeekDay 的值將用作週的第一天。
如果您想要將另一天用作週的第一天,將 first_week_day 設為:
- 0 表示星期一
- 1 表示星期二
- 2 表示星期三
- 3 表示星期四
- 4 表示星期五
- 5 表示星期六
- 6 表示星期日
現在,函數傳回的整數將使用您透過 first_week_day 設定的週的第一天。
引數 3:broken_weeks
如果您未指定 broken_weeks,則變數 BrokenWeeks 的值將用於定義週是否中斷。
依預設,Qlik Sense 函數使用未中斷的週。這表示:
- 在某些年中,第 1 週從 12 月開始,而在其他年中,第 52 或 53 週延續至 1 月。
- 第 1 週至少有四天總是在 1 月。
替代選項是使用中斷的週。
- 第 52 或 53 週不會延續至 1 月。
- 第 1 週從 1 月 1 日開始,並且在大多數情況下,不是完整的週。
可使用下列值:
- 0 (=使用未中斷的週)
- 1 (= 使用中斷的週)
引數 4:reference_day
如果您不指定 reference_day,變數 ReferenceDay 的值將用於定義要設定一月份的哪一天為參照日以定義第 1 週。依照預設,Qlik Sense 函數使用 4 作為參照日。這表示第 1 週必須包含 1 月 4 日,或者換言之,第 1 週必須始終至少在 1 月擁有 4 日。
下列值可用來設定不同的參考日:
- 1 (= 1 月 1 日)
- 2 (= 1 月 2 日)
- 3 (= 1 月 3 日)
- 4 (= 1 月 4 日)
- 5 (= 1 月 5 日)
- 6 (= 1 月 6 日)
- 7 (= 1 月 7 日)
什麼情況下使用
若您想要按週比較彙總,則 The week() 函數很實用。例如,若您想要按週查看產品的總銷售額,可使用此函數。若使用者想要計算不一定要使用應用程式的 BrokenWeeks、FirstWeekDay 或 ReferenceDay 系統變數時,即會選擇 week() 函數,而不是 weekname()。
此外,當您想要比較多個年份時,即會選擇 week() 函數。透過使用 week() 函數,使用者能夠為這些變數建立自己的組合,並用於使用函數的例子中。
這些維度在建立時可使用函數建立「主要行事曆」表格的欄位,或是直接在圖表中當作計算維度使用。
範例 | 結果 |
---|---|
week( '10/12/2012') |
傳回 41。 |
week( '35648') | 傳回 32,因為 35648 = 08/06/1997。 |
week('10/12/2012', 0, 1) | 傳回 42。 |
區域設定
除非另有說明,否則此主題中的範例皆使用下列日期格式:MM/DD/YYYY。日期格式是在資料載入指令碼的 SET DateFormat 陳述式中指定。由於地區設定和其他因素,您系統中的預設日期格式可能會不同。您可以變更以下範例中的格式,以滿足您的需求。或者,您可以在載入指令碼中變更格式,以符合這些範例。
應用程式中的預設地區設定是根據安裝 Qlik Sense 之電腦或伺服器的地區系統設定。若您存取的 Qlik Sense 伺服器設定為瑞典,資料載入編輯器將會對日期、時間和貨幣使用瑞典文地區設定。這些地區格式設定與 Qlik Sense 使用者介面中顯示的語言無關。Qlik Sense 顯示的語言將與您正在使用的瀏覽器相同。
範例 1 – 預設系統變數
概覽
開啟資料載入編輯器並將下面的載入指令碼新增至新的索引標籤。
載入指令碼包含:
-
包含一組 2021 年最後一週和 2022 年前兩週交易的資料集,這載入到稱為「Transactions」的表格中。
-
以 DateFormat 系統變數 (MM/DD/YYYY) 格式提供的日期欄位。
-
建立欄位 week_number,傳回交易發生年份和週數。
-
建立稱為 week_day 的欄位,顯示每個交易日期的工作日值。
載入指令碼
SET DateFormat='MM/DD/YYYY';
SET FirstWeekDay=6;
SET BrokenWeeks=1;
SET ReferenceDay=0;
Transactions:
Load
*,
WeekDay(date) as week_day,
Week(date) as week_number
;
Load
*
Inline
[
id,date,amount
8183,12/27/2021,58.27
8184,12/28/2021,67.42
8185,12/29/2021,23.80
8186,12/30/2021,82.06
8187,12/31/2021,40.56
8188,01/01/2022,37.23
8189,01/02/2022,17.17
8190,01/03/2022,88.27
8191,01/04/2022,57.42
8192,01/05/2022,53.80
8193,01/06/2022,82.06
8194,01/07/2022,40.56
8195,01/08/2022,53.67
8196,01/09/2022,26.63
8197,01/10/2022,72.48
8198,01/11/2022,18.37
8199,01/12/2022,45.26
8200,01/13/2022,58.23
8201,01/14/2022,18.52
];
結果
載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度:
-
id
-
date
-
week_day
-
week_number
id | 日期 | week_day | week_number |
---|---|---|---|
8183 | 12/27/2021 | 星期一 | 53 |
8184 | 12/28/2021 | 星期二 | 53 |
8185 | 12/29/2021 | 星期三 | 53 |
8186 | 12/30/2021 | 星期四 | 53 |
8187 | 12/31/2021 | 星期五 | 53 |
8188 | 01/01/2022 | 星期六 | 1 |
8189 | 01/02/2022 | 星期日 | 2 |
8190 | 01/03/2022 | 星期一 | 2 |
8191 | 01/04/2022 | 星期二 | 2 |
8192 | 01/05/2022 | 星期三 | 2 |
8193 | 01/06/2022 | 星期四 | 2 |
8194 | 01/07/2022 | 星期五 | 2 |
8195 | 01/08/2022 | 星期六 | 2 |
8196 | 01/09/2022 | 星期日 | 3 |
8197 | 01/10/2022 | 星期一 | 3 |
8198 | 01/11/2022 | 星期二 | 3 |
8199 | 01/12/2022 | 星期三 | 3 |
8200 | 01/13/2022 | 星期四 | 3 |
8201 | 01/14/2022 | 星期五 | 3 |
week_number 欄位在前置 LOAD 陳述式中的建立方式是使用 week() 函數並傳遞 date 欄位,作為函數的引數。
沒有其他參數傳遞至函數,因此下列影響 week() 函數的預設變數已生效:
-
BrokenWeeks: 週計數開始於 1 月 1 日
-
FirstWeekDay: 每週第一天是星期日
因為應用程式使用的是預設 BrokenWeeks 系統變數,所以第 1 週開始於 1 月 1 日星期六。
因為預設 FirstWeekDay 系統變數的關係,每週開始於星期六。1 月 1 日的第一個星期日發生在 1 月 2 日,亦即第 2 週開始的時候。
範例 2 – first_week_day
概覽
開啟資料載入編輯器並將下面的載入指令碼新增至新的索引標籤。
載入指令碼包含:
-
建立欄位 week_number,傳回交易發生年份和週數。
-
建立稱為 week_day 的欄位,顯示每個交易日期的工作日值。
在此範例中,我們想要將工作週的開始設定在星期二。
載入指令碼
SET DateFormat='MM/DD/YYYY';
SET FirstWeekDay=6;
SET BrokenWeeks=1;
SET ReferenceDay=0;
Transactions:
Load
*,
WeekDay(date) as week_day,
Week(date,1) as week_number
;
Load
*
Inline
[
id,date,amount
8183,12/27/2022,58.27
8184,12/28/2022,67.42
8185,12/29/2022,23.80
8186,12/30/2022,82.06
8187,12/31/2021,40.56
8188,01/01/2022,37.23
8189,01/02/2022,17.17
8190,01/03/2022,88.27
8191,01/04/2022,57.42
8192,01/05/2022,53.80
8193,01/06/2022,82.06
8194,01/07/2022,40.56
8195,01/08/2022,53.67
8196,01/09/2022,26.63
8197,01/10/2022,72.48
8198,01/11/2022,18.37
8199,01/12/2022,45.26
8200,01/13/2022,58.23
8201,01/14/2022,18.52
];
結果
載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度:
-
id
-
date
-
week_day
-
week_number
id | 日期 | week_day | week_number |
---|---|---|---|
8183 | 12/27/2021 | 星期一 | 52 |
8184 | 12/28/2021 | 星期二 | 53 |
8185 | 12/29/2021 | 星期三 | 53 |
8186 | 12/30/2021 | 星期四 | 53 |
8187 | 12/31/2021 | 星期五 | 53 |
8188 | 01/01/2022 | 星期六 | 1 |
8189 | 01/02/2022 | 星期日 | 1 |
8190 | 01/03/2022 | 星期一 | 1 |
8191 | 01/04/2022 | 星期二 | 2 |
8192 | 01/05/2022 | 星期三 | 2 |
8193 | 01/06/2022 | 星期四 | 2 |
8194 | 01/07/2022 | 星期五 | 2 |
8195 | 01/08/2022 | 星期六 | 2 |
8196 | 01/09/2022 | 星期日 | 2 |
8197 | 01/10/2022 | 星期一 | 2 |
8198 | 01/11/2022 | 星期二 | 3 |
8199 | 01/12/2022 | 星期三 | 3 |
8200 | 01/13/2022 | 星期四 | 3 |
8201 | 01/14/2022 | 星期五 | 3 |
應用程式仍使用中斷的週。但是,first_week_day 引數已在 week() 函數中設定為 1。這會將每週第一天設定為星期二。
應用程式使用的是預設 BrokenWeeks 系統變數,所以第 1 週開始於 1 月 1 日星期六。
week() 函數的 first_week_day 引數將第一週設定為星期二。因此,第 53 週開始於 2021 年 12 月 28 日。
但是,因為函數仍使用中斷的週,所以第 1 週只會持續兩天,這是 1 月 1 日後的第 1 個星期二發生在 1 月 3 日的緣故。
範例 3 – unbroken_weeks
概覽
開啟資料載入編輯器並將下面的載入指令碼新增至新的索引標籤。
載入指令碼包含與第一個範例相同的資料集和情境。
在此範例中,我們使用未中斷的週。
載入指令碼
SET DateFormat='MM/DD/YYYY';
SET FirstWeekDay=6;
SET BrokenWeeks=1;
SET ReferenceDay=0;
Transactions:
Load
*,
WeekDay(date) as week_day,
Week(date,6,0) as week_number
;
Load
*
Inline
[
id,date,amount
8183,12/27/2022,58.27
8184,12/28/2022,67.42
8185,12/29/2022,23.80
8186,12/30/2022,82.06
8187,12/31/2021,40.56
8188,01/01/2022,37.23
8189,01/02/2022,17.17
8190,01/03/2022,88.27
8191,01/04/2022,57.42
8192,01/05/2022,53.80
8193,01/06/2022,82.06
8194,01/07/2022,40.56
8195,01/08/2022,53.67
8196,01/09/2022,26.63
8197,01/10/2022,72.48
8198,01/11/2022,18.37
8199,01/12/2022,45.26
8200,01/13/2022,58.23
8201,01/14/2022,18.52
];
結果
載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度:
-
id
-
date
-
week_day
-
week_number
id | 日期 | week_day | week_number |
---|---|---|---|
8183 | 12/27/2021 | 星期一 | 52 |
8184 | 12/28/2021 | 星期二 | 52 |
8185 | 12/29/2021 | 星期三 | 52 |
8186 | 12/30/2021 | 星期四 | 52 |
8187 | 12/31/2021 | 星期五 | 52 |
8188 | 01/01/2022 | 星期六 | 52 |
8189 | 01/02/2022 | 星期日 | 1 |
8190 | 01/03/2022 | 星期一 | 1 |
8191 | 01/04/2022 | 星期二 | 1 |
8192 | 01/05/2022 | 星期三 | 1 |
8193 | 01/06/2022 | 星期四 | 1 |
8194 | 01/07/2022 | 星期五 | 1 |
8195 | 01/08/2022 | 星期六 | 1 |
8196 | 01/09/2022 | 星期日 | 2 |
8197 | 01/10/2022 | 星期一 | 2 |
8198 | 01/11/2022 | 星期二 | 2 |
8199 | 01/12/2022 | 星期三 | 2 |
8200 | 01/13/2022 | 星期四 | 2 |
8201 | 01/14/2022 | 星期五 | 2 |
first_week_date 參數設定為 1,讓星期二變成每週第一天。broken_weeks 參數設定為 0,強制函數使用未中斷的週。最後,第三個參數將 reference_day 設定為 2。
first_week_date 參數設定為 6,讓星期日變成每週第一天。broken_weeks 參數設定為 0,強制函數使用未中斷的週。
透過使用未中斷的週,第 1 週不一定會開始於 1 月 1 日;相反地,必須至少有 4 天。因此,在資料集中,第 52 週結束於 2022 年 1 月 1 日星期六。然後第 1 週開始於 FirstWeekDay 系統變數,亦即 1 月 2 日星期日。該週會結束於後面的 1 月 8 日星期日。
範例 4 – reference_day
概覽
開啟資料載入編輯器並將下面的載入指令碼新增至新的索引標籤。
載入指令碼包含:
-
相同資料集和情境為第三個範例。
-
建立欄位 week_number,傳回交易發生年份和週數。
-
建立稱為 week_day 的欄位,顯示每個交易日期的工作日值。
此外,必須符合下列條件:
-
工作週開始於星期二。
-
公司使用未中斷的週。
-
reference_day 值是 2。換句話說,第 1 週在 1 月的最小天數為 2。
載入指令碼
SET DateFormat='MM/DD/YYYY';
SET FirstWeekDay=6;
SET BrokenWeeks=1;
SET ReferenceDay=0;
Transactions:
Load
*,
WeekDay(date) as week_day,
Week(date,1,0,2) as week_number
;
Load
*
Inline
[
id,date,amount
8183,12/27/2022,58.27
8184,12/28/2022,67.42
8185,12/29/2022,23.80
8186,12/30/2022,82.06
8187,12/31/2021,40.56
8188,01/01/2022,37.23
8189,01/02/2022,17.17
8190,01/03/2022,88.27
8191,01/04/2022,57.42
8192,01/05/2022,53.80
8193,01/06/2022,82.06
8194,01/07/2022,40.56
8195,01/08/2022,53.67
8196,01/09/2022,26.63
8197,01/10/2022,72.48
8198,01/11/2022,18.37
8199,01/12/2022,45.26
8200,01/13/2022,58.23
8201,01/14/2022,18.52
];
結果
載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度:
-
id
-
date
-
week_day
-
week_number
id | 日期 | week_day | week_number |
---|---|---|---|
8183 | 12/27/2021 | 星期一 | 52 |
8184 | 12/28/2021 | 星期二 | 1 |
8185 | 12/29/2021 | 星期三 | 1 |
8186 | 12/30/2021 | 星期四 | 1 |
8187 | 12/31/2021 | 星期五 | 1 |
8188 | 01/01/2022 | 星期六 | 1 |
8189 | 01/02/2022 | 星期日 | 1 |
8190 | 01/03/2022 | 星期一 | 1 |
8191 | 01/04/2022 | 星期二 | 2 |
8192 | 01/05/2022 | 星期三 | 2 |
8193 | 01/06/2022 | 星期四 | 2 |
8194 | 01/07/2022 | 星期五 | 2 |
8195 | 01/08/2022 | 星期六 | 2 |
8196 | 01/09/2022 | 星期日 | 2 |
8197 | 01/10/2022 | 星期一 | 2 |
8198 | 01/11/2022 | 星期二 | 3 |
8199 | 01/12/2022 | 星期三 | 3 |
8200 | 01/13/2022 | 星期四 | 3 |
8201 | 01/14/2022 | 星期五 | 3 |
first_week_date 參數設定為 1,讓星期二變成每週第一天。broken_weeks 參數設定為 0,強制函數使用未中斷的週。最後,第三個參數將 reference_day 參數設定為 2。
如果函數使用未中斷的週,且參數為 reference_day 值的 2,則第 1 週只須包括 1 月的兩天。由於第一個工作日為星期二,因此第 1 週開始於 2021 年 12 月 28 日,並結束於 2022 年 1 月 3 日星期一。
範例 – 圖表物件範例
概覽
開啟資料載入編輯器並將下面的載入指令碼新增至新的索引標籤。
載入指令碼包含與第一個範例相同的資料集和情境。
不過,在此範例中,不變的資料集會載入到應用程式中。傳回週數的計算在圖表物件中建立為量值。
載入指令碼
Transactions:
Load
*
Inline
[
id,date,amount
8183,12/27/2022,58.27
8184,12/28/2022,67.42
8185,12/29/2022,23.80
8186,12/30/2022,82.06
8187,12/31/2021,40.56
8188,01/01/2022,37.23
8189,01/02/2022,17.17
8190,01/03/2022,88.27
8191,01/04/2022,57.42
8192,01/05/2022,53.80
8193,01/06/2022,82.06
8194,01/07/2022,40.56
8195,01/08/2022,53.67
8196,01/09/2022,26.63
8197,01/10/2022,72.48
8198,01/11/2022,18.37
8199,01/12/2022,45.26
8200,01/13/2022,58.23
8201,01/14/2022,18.52
];
結果
請執行下列動作:
-
載入資料並開啟工作表。 建立新的表格。
-
新增下列欄位作為維度:
-
id
-
date
-
-
接下來,建立下列量值:
=week (date)
-
建立量值 , week_day 以顯示每個交易日期的工作日值:
=weekday(date)
id | 日期 | =week(date) | =weekday(date) |
---|---|---|---|
8183 | 12/27/2021 | 53 | 星期一 |
8184 | 12/28/2021 | 53 | 星期二 |
8185 | 12/29/2021 | 53 | 星期三 |
8186 | 12/30/2021 | 53 | 星期四 |
8187 | 12/31/2021 | 53 | 星期五 |
8188 | 01/01/2022 | 1 | 星期六 |
8189 | 01/02/2022 | 2 | 星期日 |
8190 | 01/03/2022 | 2 | 星期一 |
8191 | 01/04/2022 | 2 | 星期二 |
8192 | 01/05/2022 | 2 | 星期三 |
8193 | 01/06/2022 | 2 | 星期四 |
8194 | 01/07/2022 | 2 | 星期五 |
8195 | 01/08/2022 | 2 | 星期六 |
8196 | 01/09/2022 | 3 | 星期日 |
8197 | 01/10/2022 | 3 | 星期一 |
8198 | 01/11/2022 | 3 | 星期二 |
8199 | 01/12/2022 | 3 | 星期三 |
8200 | 01/13/2022 | 3 | 星期四 |
8201 | 01/14/2022 | 3 | 星期五 |
week_number 欄位在前置 LOAD 陳述式中的建立方式是使用 week() 函數並傳遞 date 欄位,作為函數的引數。
沒有其他參數傳遞至函數,因此下列影響 week() 函數的預設變數已生效:
-
BrokenWeeks: 週計數開始於 1 月 1 日
-
FirstWeekDay: 每週第一天是星期日
因為應用程式使用的是預設 BrokenWeeks 系統變數,所以第 1 週開始於 1 月 1 日星期六。
因為預設 FirstWeekDay 系統變數的關係,每週開始於星期六。1 月 1 日的第一個星期日發生在 1 月 2 日,亦即第 2 週開始的時候。
範例 6 – 情境
概覽
開啟資料載入編輯器並將下面的載入指令碼新增至新的索引標籤。
載入指令碼包含:
-
包含一組 2019 年最後一週和 2020 年前兩週交易的資料集,這載入到稱為「Transactions」的表格中。
- 以 DateFormat 系統變數 (MM/DD/YYYY) 格式提供的日期欄位。
應用程式在儀表板之間主要使用中斷的週。但是,最終使用者需要使用未中斷的週按週呈現總銷售額的圖表物件。參考日應為 1 月 2 日,且每週開始於星期二。當資料模型中無法使用此維度時,在圖表中將 week() 函數作為計算維度可達成這一點。
載入指令碼
SET BrokenWeeks=1;
SET ReferenceDay=0;
SET DateFormat='MM/DD/YYYY';
Transactions:
Load
*
Inline
[
id,date,amount
8183,12/27/2019,58.27
8184,12/28/2019,67.42
8185,12/29/2019,23.80
8186,12/30/2019,82.06
8187,12/31/2019,40.56
8188,01/01/2020,37.23
8189,01/02/2020,17.17
8190,01/03/2020,88.27
8191,01/04/2020,57.42
8192,01/05/2020,53.80
8193,01/06/2020,82.06
8194,01/07/2020,40.56
8195,01/08/2020,53.67
8196,01/09/2020,26.63
8197,01/10/2020,72.48
8198,01/11/2020,18.37
8199,01/12/2020,45.26
8200,01/13/2020,58.23
8201,01/14/2020,18.52
];
結果
請執行下列動作:
-
載入資料並開啟工作表。 建立新的表格。
-
建立下列計算維度:
=week(date)
-
接下來,建立下列彙總量值:
=sum(amount)
-
將量值的數字格式設定為金錢。
-
選擇「排序」功能表,並針對計算維度移除自訂排序。
-
取消選取「按數字排序」和「按字母排序」選項。
week(date) | sum(amount) |
---|---|
52 | $125.69 |
53 | $146.42 |
1 | $200.09 |
2 | $347.57 |
3 | $122.01 |