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 周必须包含 ReferenceDay 系统变量定义的 1 月份的特定天数。因此,第 1 周可能在 12 月开始,或者第 52 或 53 周可能持续到1月。最后,reference_day 参数允许函数重写 ReferenceDay 系统变量。
与 weekname() 函数不同,week() 函数也不返回年份值。这允许跨年进行周比较的汇总。
此函数中可以使用四个参数。
参数 # 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 周始终至少有 4 天。
替代方法是使用不连续的周。
- 第 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(表示 2 月 1 日)
- 3(表示 3 月 1 日)
- 4(表示 4 月 1 日)
- 5(表示 5 月 1 日)
- 6(表示 6 月 1 日)
- 7(表示 7 月 1 日)
适用场景
当您希望按周比较聚合时,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 | Mon | 53 |
8184 | 12/28/2021 | Tue | 53 |
8185 | 12/29/2021 | Wed | 53 |
8186 | 12/30/2021 | Thu | 53 |
8187 | 12/31/2021 | Fri | 53 |
8188 | 01/01/2022 | Sat | 1 |
8189 | 01/02/2022 | Sun | 2 |
8190 | 01/03/2022 | Mon | 2 |
8191 | 01/04/2022 | Tue | 2 |
8192 | 01/05/2022 | Wed | 2 |
8193 | 01/06/2022 | Thu | 2 |
8194 | 01/07/2022 | Fri | 2 |
8195 | 01/08/2022 | Sat | 2 |
8196 | 01/09/2022 | Sun | 3 |
8197 | 01/10/2022 | Mon | 3 |
8198 | 01/11/2022 | Tue | 3 |
8199 | 01/12/2022 | Wed | 3 |
8200 | 01/13/2022 | Thu | 3 |
8201 | 01/14/2022 | Fri | 3 |
通过使用 week() 函数并将 date 字段作为函数的参数传递,在前面的 LOAD 语句中创建了 week_number 字段。
没有其他参数传递到函数中,因此影响 week() 函数的以下默认变量有效:
-
BrokenWeeks:周计数从 1 月 1 日开始
-
FirstWeekDay:一周的第一天是星期天
因为应用程序正在使用默认 BrokenWeeks 系统变量,所以第一周从 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 | Mon | 52 |
8184 | 12/28/2021 | Tue | 53 |
8185 | 12/29/2021 | Wed | 53 |
8186 | 12/30/2021 | Thu | 53 |
8187 | 12/31/2021 | Fri | 53 |
8188 | 01/01/2022 | Sat | 1 |
8189 | 01/02/2022 | Sun | 1 |
8190 | 01/03/2022 | Mon | 1 |
8191 | 01/04/2022 | Tue | 2 |
8192 | 01/05/2022 | Wed | 2 |
8193 | 01/06/2022 | Thu | 2 |
8194 | 01/07/2022 | Fri | 2 |
8195 | 01/08/2022 | Sat | 2 |
8196 | 01/09/2022 | Sun | 2 |
8197 | 01/10/2022 | Mon | 2 |
8198 | 01/11/2022 | Tue | 3 |
8199 | 01/12/2022 | Wed | 3 |
8200 | 01/13/2022 | Thu | 3 |
8201 | 01/14/2022 | Fri | 3 |
应用程序仍在使用中断周。但是,week()函数中的 first_week_day 参数已设置为 1。这将一周的第一天设置为星期二。
应用程序正在使用默认 BrokenWeeks 系统变量,所以第一周从 1 月 1 日(星期六)开始。
week() 函数的 first_week_day 参数将第一个工作日设置为星期二。因此,第 53 周从 2021 年 12 月 28 日开始。
但是,由于该函数仍在使用中断周,第 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 | Mon | 52 |
8184 | 12/28/2021 | Tue | 52 |
8185 | 12/29/2021 | Wed | 52 |
8186 | 12/30/2021 | Thu | 52 |
8187 | 12/31/2021 | Fri | 52 |
8188 | 01/01/2022 | Sat | 52 |
8189 | 01/02/2022 | Sun | 1 |
8190 | 01/03/2022 | Mon | 1 |
8191 | 01/04/2022 | Tue | 1 |
8192 | 01/05/2022 | Wed | 1 |
8193 | 01/06/2022 | Thu | 1 |
8194 | 01/07/2022 | Fri | 1 |
8195 | 01/08/2022 | Sat | 1 |
8196 | 01/09/2022 | Sun | 2 |
8197 | 01/10/2022 | Mon | 2 |
8198 | 01/11/2022 | Tue | 2 |
8199 | 01/12/2022 | Wed | 2 |
8200 | 01/13/2022 | Thu | 2 |
8201 | 01/14/2022 | Fri | 2 |
first_week_date 参数设置为 1,使星期二成为一周的第一天。broken_weeks 参数设置为 0,强制函数使用非中断周。最后,第三个参数将 reference_day 设置为 2。
first_week_date 参数设置为 6,使星期日成为一周的第一天。broken_weeks 参数设置为 0,强制函数使用非中断周。
通过使用连续周,第一周不一定从 1 月 1 日开始;相反,它要求至少有四天。因此,在数据集中,第 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 | Mon | 52 |
8184 | 12/28/2021 | Tue | 1 |
8185 | 12/29/2021 | Wed | 1 |
8186 | 12/30/2021 | Thu | 1 |
8187 | 12/31/2021 | Fri | 1 |
8188 | 01/01/2022 | Sat | 1 |
8189 | 01/02/2022 | Sun | 1 |
8190 | 01/03/2022 | Mon | 1 |
8191 | 01/04/2022 | Tue | 2 |
8192 | 01/05/2022 | Wed | 2 |
8193 | 01/06/2022 | Thu | 2 |
8194 | 01/07/2022 | Fri | 2 |
8195 | 01/08/2022 | Sat | 2 |
8196 | 01/09/2022 | Sun | 2 |
8197 | 01/10/2022 | Mon | 2 |
8198 | 01/11/2022 | Tue | 3 |
8199 | 01/12/2022 | Wed | 3 |
8200 | 01/13/2022 | Thu | 3 |
8201 | 01/14/2022 | Fri | 3 |
first_week_date 参数设置为 1,使星期二成为一周的第一天。broken_weeks 参数设置为 0,强制函数使用非中断周。最后,第三个参数将 reference_day 参数设置为2。
该函数使用连续的周数,并将 reference_day 值 2 用作参数,因此第 1 周只需要包括 1 月份的两天。由于第一个工作日是星期二,第一周从 2021 年 12 月 28 日开始,到 2022 年 1 月 3 日星期一结束。
示例 5 – 图表对象示例
概述
打开数据加载编辑器,并将下面的加载脚本添加到新选项卡。
加载脚本包含与第一个示例相同的数据集和场景。
然而,在本例中,未更改的数据集被加载到应用程序中。返回周数的计算在图表对象中创建为度量。
加载脚本
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 | Mon |
8184 | 12/28/2021 | 53 | Tue |
8185 | 12/29/2021 | 53 | Wed |
8186 | 12/30/2021 | 53 | Thu |
8187 | 12/31/2021 | 53 | Fri |
8188 | 01/01/2022 | 1 | Sat |
8189 | 01/02/2022 | 2 | Sun |
8190 | 01/03/2022 | 2 | Mon |
8191 | 01/04/2022 | 2 | Tue |
8192 | 01/05/2022 | 2 | Wed |
8193 | 01/06/2022 | 2 | Thu |
8194 | 01/07/2022 | 2 | Fri |
8195 | 01/08/2022 | 2 | Sat |
8196 | 01/09/2022 | 3 | Sun |
8197 | 01/10/2022 | 3 | Mon |
8198 | 01/11/2022 | 3 | Tue |
8199 | 01/12/2022 | 3 | Wed |
8200 | 01/13/2022 | 3 | Thu |
8201 | 01/14/2022 | 3 | Fri |
通过使用 week() 函数并将 date 字段作为函数的参数传递,在前面的 LOAD 语句中创建了 week_number 字段。
没有其他参数传递到函数中,因此影响 week() 函数的以下默认变量有效:
-
BrokenWeeks:周计数从 1 月 1 日开始
-
FirstWeekDay:一周的第一天是星期天
因为应用程序正在使用默认 BrokenWeeks 系统变量,所以第一周从 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 |