week - 脚本和图表函数
此函数返回一个整数,表示与输入的日期对应的周数。
语法:
week(timestamp [, first_week_day [, broken_weeks [, reference_day]]])
返回数据类型: 整数
参数 | 说明 |
---|---|
timestamp | 要评估的日期或时间戳。 |
first_week_day |
指定一周的开始日期。如果忽略,使用 FirstWeekDay 变量的值。 可能的值 first_week_day 为:周一为 0,周二为 1,周三为 2,周四为3,周五为 4,周六为 5,星期日为 6。 有关系统变量的详细信息,请参见FirstWeekDay。 |
broken_weeks |
如果不指定 broken_weeks,则变量 BrokenWeeks 的值将用于定义周是否已中断。 有关系统变量的详细信息,请参见BrokenWeeks |
reference_day |
如果不指定 reference_day,则变量 ReferenceDay 的值将用于定义将一月的哪一天设置为定义第 1 周的参考日。默认设置下, Qlik Sense 函数使用 4 作为参考日。这意味着第 1 周必须包含 1 月 4 日,换句话说,第 1 周始终至少具有 1 月份的前 4 天。 有关系统变量的详细信息,请参见ReferenceDay |
week() 函数确定日期属于哪一周,并返回周数。
在 Qlik Sense 中,创建应用程序时获取区域设置,相应的设置作为环境变量存储在脚本中。这些用于确定周数。
这意味着大多数欧洲应用程序开发人员都会获得以下环境变量,与 ISO 8601 定义相对应:
北美应用程序开发人员通常会获得以下环境变量:
一周的第一天由 FirstWeekDay系统变量确定。您还可以使用 week() 函数中的 first_week_day 参数更改将哪个月设置为第一个月。
如果您的应用程序使用中断周,则周数计数从 1 月 1 日开始,并在 FirstWeekDay 系统变量前一天结束,而不管发生了多少天。
如果您的应用程序使用的是连续的周,则第 1 周可以从上一年开始,也可以从 1 月的前几天开始。这取决于如何使用 FirstWeekDay 和 ReferenceDay 环境变量。
适用场景
当您希望按周比较聚合时,The week() 函数非常有用。例如,如果您想查看每周产品的总销售额,则可以使用它。当用户希望计算不一定使用应用程序的 BrokenWeeks、FirstWeekDay 或 ReferenceDay 系统变量时,会选择函数 week() 而不是 weekname()。
例如,如果您想查看每周产品的总销售额。
如果应用程序使用不间断的周,则第 1 周可能包含上一年 12 月的日期,也可能不包括本年 1 月的日期。如果应用程序使用的是中断周,则第 1 周可能少于 7 天。
区域设置
除非另有规定,本主题中的示例使用以下日期格式:MM/DD/YYYY。日期格式已经在数据加载脚本中的 SET DateFormat 语句中指定。由于区域设置和其他因素,系统中的默认日期格式可能有所不同。您可以更改以下示例中的格式以满足您的要求。或者,您可以更改加载脚本中的格式以匹配这些示例。
应用程序中的默认区域设置基于安装 Qlik Sense 的计算机或服务器的区域系统设置。如果您访问的 Qlik Sense 服务器设置为瑞典,则数据加载编辑器将使用瑞典地区设置的日期、时间和货币。这些区域格式设置与 Qlik Sense 用户界面中显示的语言无关。Qlik Sense 将以与您使用的浏览器相同的语言显示。
以下示例假设
示例 | 结果 |
---|---|
week('12/28/2021') |
返回 52。 |
week(44614) | 返回 8,因为这是 2022 年 2 月 22 日的序列号。 |
week('01/03/2021') | 返回 53。 |
week('01/03/2021',6) | 返回 1。 |
示例 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 |