weekstart - 指令碼與圖表函數在此頁面
此功能傳回的值相當於包含 date 的行事曆週第一天、第一毫秒的時間戳記。預設的輸出格式為指令碼中所設定的 DateFormat 。
語法:
WeekStart( timestamp [, period_no [, first_week_day ]] )
傳回的資料類型: 雙值
weekstart() 函數判定日期落在哪一週。然後以日期格式傳回該週第一毫秒的時間戳記。該週的第一天由 FirstWeekDay 環境變數 決定。但是,這可由 weekstart() 函數中的 first_week_day 引數取代。
引數
timestamp
要評估的時間戳記。
period_no
shift 為整數,值 0 表示是包含 date 的週。負值的 shift 表示之前的週,正值表示之後的週。
first_week_day
指定一週開始的日期。如果忽略,將使用變數 FirstWeekDay 的值。
first_week_day 可能的值是對星期一使用 0、對星期二使用 1,對星期三使用 2,對星期四使用 3,對星期五使用 4,對星期六使用 5,並對星期日使用 6。
如需系統變數的更多資訊,請參閱 FirstWeekDay 。
什麼情況下使用
weekstart() 函數通常在使用者想要計算使用一週中已經過的部分時,作為運算式的一部分使用。例如,若使用者想要計算員工目前為止在一週中所賺取的總工資,即可使用此函數。
下列範例假設:
SET FirstWeekDay=0;
函數範例
weekstart('01/12/2013')
傳回 01/07/2013 。
weekstart('01/12/2013', -1 )
傳回 11/31/2012 。
weekstart('01/12/2013', 0, 1)
傳回 01/08/2013 。
區域設定
除非另有說明,否則此主題中的範例皆使用下列日期格式:MM/DD/YYYY。日期格式是在資料載入指令碼的 SET DateFormat 陳述式中指定。由於地區設定和其他因素,您系統中的預設日期格式可能會不同。您可以變更以下範例中的格式,以滿足您的需求。或者,您可以在載入指令碼中變更格式,以符合這些範例。如需詳細資訊,請參閱 修改用於應用程式和指令碼的區域設定 。
應用程式中的預設地區設定是根據使用者設定檔。這些地區格式設定與 Qlik Cloud 使用者介面中顯示的語言無關。Qlik Cloud 顯示的語言將與您正在使用的瀏覽器相同。
若您是應用程式建立者,可以為您建立的應用程式設定預設地區。如需詳細資訊,請參閱Qlik Cloud 分析 中設定用於建立應用程式和指令碼的偏好區域設定 。
範例:
若您想要週和週數的 ISO 設定,確認指令碼中有下列內容:
Set DateFormat ='YYYY-MM-DD';
Set FirstWeekDay =0; // Monday as first week day
Set BrokenWeeks =0; //(use unbroken weeks)
Set ReferenceDay =4; // Jan 4th is always in week 1
若您想要 US 設定,確認指令碼中有下列內容:
Set DateFormat ='M/D/YYYY';
Set FirstWeekDay =6; // Sunday as first week day
Set BrokenWeeks =1; //(use broken weeks)
Set ReferenceDay =1; // Jan 1st is always in week 1
以上範例從 weekstart() 函數產生下列內容:
Weekstart 函數範例
日期
ISO 週開始
US 週開始
Sat 2020 Dec 26
2020-12-21
12/20/2020
Sun 2020 Dec 27
2020-12-21
12/27/2020
Mon 2020 Dec 28
2020-12-28
12/27/2020
Tue 2020 Dec 29
2020-12-28
12/27/2020
Wed 2020 Dec 30
2020-12-28
12/27/2020
Thu 2020 Dec 31
2020-12-28
12/27/2020
Fri 2021 Jan 1
2020-12-28
12/27/2020
Sat 2021 Jan 2
2020-12-28
12/27/2020
Sun 2021 Jan 3
2020-12-28
1/3/2021
Mon 2021 Jan 4
2021-01-04
1/3/2021
Tue 2021 Jan 5
2021-01-04
1/3/2021
資訊備註 在 ISO 欄中,一週在星期一開始,而在 US 欄中,在星期日開始。
範例 1 – 無其他引數
載入指令碼和結果
概覽
開啟資料載入編輯器並將下面的載入指令碼新增至新的索引標籤。
載入指令碼包含:
包含一組 2022 年交易的資料集 ,這載入到稱為 Transactions 的表格中。
以 DateFormat 系統變數 (MM/DD/YYYY) 格式提供的日期欄位 。
建立欄位 start_of_week ,這傳回交易發生時每週開始的時間戳記。
載入指令碼
SET FirstWeekDay=6;
Transactions:
Load
*,
weekstart(date) as start_of_week,
timestamp(weekstart(date)) as start_of_week_timestamp
;
Load
*
Inline
[
id,date,amount
8188,1/7/2022,17.17
8189,1/19/2022,37.23
8190,2/28/2022,88.27
8191,2/5/2022,57.42
8192,3/16/2022,53.80
8193,4/1/2022,82.06
8194,5/7/2022,40.39
8195,5/16/2022,87.21
8196,6/15/2022,95.93
8197,6/26/2022,45.89
8198,7/9/2022,36.23
8199,7/22/2022,25.66
8200,7/23/2022,82.77
8201,7/27/2022,69.98
8202,8/2/2022,76.11
8203,8/8/2022,25.12
8204,8/19/2022,46.23
8205,9/26/2022,84.21
8206,10/14/2022,96.24
8207,10/29/2022,67.67
];
結果
載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度:
date
start_of_week
start_of_week_timestamp
結果表格
1/7/2022
01/02/2022
1/2/2022 12:00:00 AM
1/19/2022
01/16/2022
1/16/2022 12:00:00 AM
2/5/2022
01/30/2022
1/30/2022 12:00:00 AM
2/28/2022
02/27/2022
2/27/2022 12:00:00 AM
3/16/2022
03/13/2022
3/13/2022 12:00:00 AM
4/1/2022
03/27/2022
3/27/2022 12:00:00 AM
5/7/2022
05/01/2022
5/1/2022 12:00:00 AM
5/16/2022
05/15/2022
5/15/2022 12:00:00 AM
6/15/2022
06/12/2022
6/12/2022 12:00:00 AM
6/26/2022
06/26/2022
6/26/2022 12:00:00 AM
7/9/2022
07/03/2022
7/3/2022 12:00:00 AM
7/22/2022
07/17/2022
7/17/2022 12:00:00 AM
7/23/2022
07/17/2022
7/17/2022 12:00:00 AM
7/27/2022
07/24/2022
7/24/2022 12:00:00 AM
8/2/2022
07/31/2022
7/31/2022 12:00:00 AM
8/8/2022
08/07/2022
8/7/2022 12:00:00 AM
8/19/2022
08/14/2022
8/14/2022 12:00:00 AM
9/26/2022
09/25/2022
9/25/2022 12:00:00 AM
10/14/2022
10/09/2022
10/9/2022 12:00:00 AM
10/29/2022
10/23/2022
10/23/2022 12:00:00 AM
start_of_week 欄位在前置 LOAD 陳述式中的建立方式是使用 weekstart() 函數並傳遞日期欄位,作為函數的引數。
The weekstart() 函數最初識別日期值落在哪一週,並傳回該週第一毫秒的時間戳記。
weekstart() 函數的圖表,無其他引數的範例
交易 8191 發生在 2 月 5 日。FirstWeekDay 系統變數會將每週第一天設為星期日。weekstart() 函數識別 2 月 5 日前的第一個星期六 – 因此是每週的開始 – 落在 1 月 30 日。因此,該交易的 start_of_week 值會傳回該日子的第一毫秒,亦即 1 月 30 日上午 12:00:00。
範例 2 – period_no
載入指令碼和結果
概覽
開啟資料載入編輯器並將下面的載入指令碼新增至新的索引標籤。
載入指令碼包含:
載入指令碼
SET DateFormat='MM/DD/YYYY';
Transactions:
Load
*,
weekstart(date,-1) as previous_week_start,
timestamp(weekstart(date,-1)) as previous_week_start_timestamp
;
Load
*
Inline
[
id,date,amount
8188,1/7/2022,17.17
8189,1/19/2022,37.23
8190,2/28/2022,88.27
8191,2/5/2022,57.42
8192,3/16/2022,53.80
8193,4/1/2022,82.06
8194,5/7/2022,40.39
8195,5/16/2022,87.21
8196,6/15/2022,95.93
8197,6/26/2022,45.89
8198,7/9/2022,36.23
8199,7/22/2022,25.66
8200,7/23/2022,82.77
8201,7/27/2022,69.98
8202,8/2/2022,76.11
8203,8/8/2022,25.12
8204,8/19/2022,46.23
8205,9/26/2022,84.21
8206,10/14/2022,96.24
8207,10/29/2022,67.67
];
結果
載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度:
結果表格
1/7/2022
12/26/2021
12/26/2021 12:00:00 AM
1/19/2022
01/09/2022
1/9/2022 12:00:00 AM
2/5/2022
01/23/2022
1/23/2022 12:00:00 AM
2/28/2022
02/20/2022
2/20/2022 12:00:00 AM
3/16/2022
03/06/2022
3/6/2022 12:00:00 AM
4/1/2022
03/20/2022
3/20/2022 12:00:00 AM
5/7/2022
04/24/2022
4/24/2022 12:00:00 AM
5/16/2022
05/08/2022
5/8/2022 12:00:00 AM
6/15/2022
06/05/2022
6/5/2022 12:00:00 AM
6/26/2022
06/19/2022
6/19/2022 12:00:00 AM
7/9/2022
06/26/2022
6/26/2022 12:00:00 AM
7/22/2022
07/10/2022
7/10/2022 12:00:00 AM
7/23/2022
07/10/2022
7/10/2022 12:00:00 AM
7/27/2022
07/17/2022
7/17/2022 12:00:00 AM
8/2/2022
07/24/2022
7/24/2022 12:00:00 AM
8/8/2022
07/31/2022
7/31/2022 12:00:00 AM
8/19/2022
08/07/2022
8/7/2022 12:00:00 AM
9/26/2022
09/18/2022
9/18/2022 12:00:00 AM
10/14/2022
10/02/2022
10/2/2022 12:00:00 AM
10/29/2022
10/16/2022
10/16/2022 12:00:00 AM
在此例中,因為 period_no 的值 -1 已作為 weekstart() 函數中的偏移引數使用,所以該函數首先會識別交易發生的週。然後這會查看前一週並識別該週的第一毫秒。
weekstart() 函數的圖表,period_no 範例
交易 8196 發生在 6 月 15 日。weekstart() 函數識別該週開始於 6 月 12 日。因此,前一週開始於 6 月 5 日 12:00:00 AM;這是 previous_week_start 欄位傳回的值。
範例 3 – first_week_day
載入指令碼和結果
概覽
開啟資料載入編輯器 並將下面的載入指令碼 新增至新的索引標籤。
載入指令碼包含與第一個範例相同的資料集和情境。但是在此範例中,我們必須將星期二設為工作週第一天。
載入指令碼
SET DateFormat='MM/DD/YYYY';
Transactions:
Load
*,
weekstart(date,0,1) as start_of_week,
timestamp(weekstart(date,0,1)) as start_of_week_timestamp
;
Load
*
Inline
[
id,date,amount
8188,1/7/2022,17.17
8189,1/19/2022,37.23
8190,2/28/2022,88.27
8191,2/5/2022,57.42
8192,3/16/2022,53.80
8193,4/1/2022,82.06
8194,5/7/2022,40.39
8195,5/16/2022,87.21
8196,6/15/2022,95.93
8197,6/26/2022,45.89
8198,7/9/2022,36.23
8199,7/22/2022,25.66
8200,7/23/2022,82.77
8201,7/27/2022,69.98
8202,8/2/2022,76.11
8203,8/8/2022,25.12
8204,8/19/2022,46.23
8205,9/26/2022,84.21
8206,10/14/2022,96.24
8207,10/29/2022,67.67
];
結果
載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度:
date
start_of_week
start_of_week_timestamp
結果表格
1/7/2022
01/04/2022
1/4/2022 12:00:00 AM
1/19/2022
01/18/2022
1/18/2022 12:00:00 AM
2/5/2022
02/01/2022
2/1/2022 12:00:00 AM
2/28/2022
02/22/2022
2/22/2022 12:00:00 AM
3/16/2022
03/15/2022
3/15/2022 12:00:00 AM
4/1/2022
03/29/2022
3/29/2022 12:00:00 AM
5/7/2022
05/03/2022
5/3/2022 12:00:00 AM
5/16/2022
05/10/2022
5/10/2022 12:00:00 AM
6/15/2022
06/14/2022
6/14/2022 12:00:00 AM
6/26/2022
06/21/2022
6/21/2022 12:00:00 AM
7/9/2022
07/05/2022
7/5/2022 12:00:00 AM
7/22/2022
07/19/2022
7/19/2022 12:00:00 AM
7/23/2022
07/19/2022
7/19/2022 12:00:00 AM
7/27/2022
07/26/2022
7/26/2022 12:00:00 AM
8/2/2022
08/02/2022
8/2/2022 12:00:00 AM
8/8/2022
08/02/2022
8/2/2022 12:00:00 AM
8/19/2022
08/16/2022
8/16/2022 12:00:00 AM
9/26/2022
09/20/2022
9/20/2022 12:00:00 AM
10/14/2022
10/11/2022
10/11/2022 12:00:00 AM
10/29/2022
10/25/2022
10/25/2022 12:00:00 AM
在此例中,因為 first_week_date 引數的值 1 已用於 weekstart() 函數中,所以這會將每週第一天設為星期二。
weekstart() 函數的圖表,first_week_day 範例
交易 8191 發生在 2 月 5 日。weekstart() 函數識別此日期前的第一個星期二 – 因此是每週的開始並傳回該值 – 落在 2 月 1 日 12:00:00 AM。
範例 4 – 圖表物件範例
載入指令碼和圖表運算式
概覽
開啟資料載入編輯器並將下面的載入指令碼新增至新的索引標籤。
載入指令碼包含與第一個範例相同的資料集和情境。
不過,在此範例中,不變的資料集會載入到應用程式中。會建立傳回交易發生週開始時間戳記的計算,作為應用程式圖表物件中的量值 。
載入指令碼
Transactions:
Load
*
Inline
[
id,date,amount
8188,1/7/2022,17.17
8189,1/19/2022,37.23
8190,2/28/2022,88.27
8191,2/5/2022,57.42
8192,3/16/2022,53.80
8193,4/1/2022,82.06
8194,5/7/2022,40.39
8195,5/16/2022,87.21
8196,6/15/2022,95.93
8197,6/26/2022,45.89
8198,7/9/2022,36.23
8199,7/22/2022,25.66
8200,7/23/2022,82.77
8201,7/27/2022,69.98
8202,8/2/2022,76.11
8203,8/8/2022,25.12
8204,8/19/2022,46.23
8205,9/26/2022,84.21
8206,10/14/2022,96.24
8207,10/29/2022,67.67
];
結果
載入資料並開啟工作表。建立新的表格並將此欄位新增為維度: date 。
若要計算交易發生的該週開始時間,新增下列量值:
結果表格
1/7/2022
01/02/2022
1/2/2022 12:00:00 AM
1/19/2022
01/16/2022
1/16/2022 12:00:00 AM
2/5/2022
01/30/2022
1/30/2022 12:00:00 AM
2/28/2022
02/27/2022
2/27/2022 12:00:00 AM
3/16/2022
03/13/2022
3/13/2022 12:00:00 AM
4/1/2022
03/27/2022
3/27/2022 12:00:00 AM
5/7/2022
05/01/2022
5/1/2022 12:00:00 AM
5/16/2022
05/15/2022
5/15/2022 12:00:00 AM
6/15/2022
06/12/2022
6/12/2022 12:00:00 AM
6/26/2022
06/26/2022
6/26/2022 12:00:00 AM
7/9/2022
07/03/2022
7/3/2022 12:00:00 AM
7/22/2022
07/17/2022
7/17/2022 12:00:00 AM
7/23/2022
07/17/2022
7/17/2022 12:00:00 AM
7/27/2022
07/24/2022
7/24/2022 12:00:00 AM
8/2/2022
07/31/2022
7/31/2022 12:00:00 AM
8/8/2022
08/07/2022
8/7/2022 12:00:00 AM
8/19/2022
08/14/2022
8/14/2022 12:00:00 AM
9/26/2022
09/25/2022
9/25/2022 12:00:00 AM
10/14/2022
10/09/2022
10/9/2022 12:00:00 AM
10/29/2022
10/23/2022
10/23/2022 12:00:00 AM
start_of_week 量值在圖表物件中的建立方式是使用 weekstart() 函數並傳遞 date 欄位,作為函數的引數。
The weekstart() 函數最初識別日期值落在哪一週,並傳回該週第一毫秒的時間戳記。
weekstart() 函數的圖表,圖表物件範例
交易 8191 發生在 2 月 5 日。FirstWeekDay 系統變數會將每週第一天設為星期日。weekstart() 函數識別 2 月 5 日前的第一個星期日 – 因此是每週開始 – 落在 1 月 30 日。因此,該交易的 start_of_week 值傳回該日子的第一毫秒,亦即 1 月 30 日上午 12:00:00。
範例 5 – 情境
載入指令碼和圖表運算式
概覽
開啟資料載入編輯器並將下面的載入指令碼新增至新的索引標籤。
載入指令碼包含:
員工在星期一開始工作且每週工作六天。FirstWeekDay 系統變數不得修改。
最終使用者想要圖表物件按員工 ID 和員工姓名顯示該週至今所賺取的工資。
載入指令碼
Payroll:
Load
*
Inline
[
employee_id,employee_name,day_rate
182,Mark, $150
183,Deryck, $125
184,Dexter, $125
185,Sydney,$270
186,Agatha,$128
];
結果
請執行下列動作:
載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度:
employee_id
employee_name
接下來,建立量值以計算該週至今所賺取的工資:
=if(today(1)-weekstart(today(1),0,0)<7,(today(1)-weekstart(today(1),0,0))*day_rate,day_rate*6)
將量值的數字格式 設定為金錢 。
結果表格
182
Mark
$600.00
183
Deryck
$500.00
184
Dexter
$500.00
185
Sydney
$1080.00
186
Agatha
$512.00
藉由使用今日日期作為其第一個引數,weekstart() 函數會將星期一設為該週第一天並傳回目前週的開始日期。以目前日期減去該結果後,運算式會傳回本週目前已經過的天數。
然後條件就會評估本週是否超過六天。如果是的話,員工的 day_rate 會乘以 6 天。否則,day_rate 會乘以本週目前為止已經過的天數。