inweek - 脚本和图表函数
此函数用于返回 True,如果 timestamp 位于包含 base_date 的星期以内。
语法:
InWeek (timestamp, base_date, period_no[, first_week_day])
返回数据类型: 布尔值
在 Qlik Sense 中,布尔 true 值由 -1 表示,false 值由 0 表示。
inweek() 函数使用base_date 参数来确定日期所属的七天期间。一周的开始日期基于 FirstWeekDay 系统变量。但是,您可以使用 inweek() 函数中的 first_week_day 参数更改将哪个月设置为第一个月。
定义选定的周后,将指定的日期值与该周段进行比较时,函数将返回布尔值结果。
适用场景
inweek() 函数返回布尔值结果。通常,这种类型的函数将用作 if expression 中的条件。inweek() 函数返回一个聚合或计算,该聚合或计算取决于所计算的日期是否发生在 base_date 参数的选定日期所在的周内。
例如,inweek() 函数可用于识别特定周内制造的所有设备。
参数 | 说明 |
---|---|
timestamp | 想要用来与 base_date 进行比较的日期。 |
base_date | 日期用于计算星期的值。 |
period_no | 该星期可通过 period_no 偏移。period_no 为整数,其中值 0 表示该星期包含 base_date。period_no 为负数表示前几个星期,正数表示随后的几个星期。 |
first_week_day |
默认情况下,一周的第一天是星期日(由 FirstWeekDay 系统变量确定),从星期六和星期日之间的午夜开始。first_week_day 参数取代 FirstWeekDay 变量。要指示一周从另外一天开始,指定一个介于 0 和 6 之间的标志。 |
日 | 值 |
---|---|
星期一 | 0 |
星期二 | 1 |
星期三 | 2 |
星期四 | 3 |
星期五 | 4 |
星期六 | 5 |
星期日 | 6 |
区域设置
除非另有规定,本主题中的示例使用以下日期格式:MM/DD/YYYY。日期格式已经在数据加载脚本中的 SET DateFormat 语句中指定。由于区域设置和其他因素,系统中的默认日期格式可能有所不同。您可以更改以下示例中的格式以满足您的要求。或者,您可以更改加载脚本中的格式以匹配这些示例。
应用程序中的默认区域设置基于安装 Qlik Sense 的计算机或服务器的区域系统设置。如果您访问的 Qlik Sense 服务器设置为瑞典,则数据加载编辑器将使用瑞典地区设置的日期、时间和货币。这些区域格式设置与 Qlik Sense 用户界面中显示的语言无关。Qlik Sense 将以与您使用的浏览器相同的语言显示。
示例 | 结果 |
---|---|
inweek ('01/12/2006', '01/14/2006', 0) | 返回 TRUE |
inweek ('01/12/2006', '01/20/2006', 0 ) | 返回 FALSE |
inweek ('01/12/2006', '01/14/2006', -1 ) | 返回 FALSE |
inweek ('01/07/2006', '01/14/2006', -1) | 返回 TRUE |
inweek ('01/12/2006', '01/09/2006', 0, 3) | 返回 FALSE是因为 first_week_day 指定为 3(星期四),这使得 01/12/2006 称为包含 01/09/2006 的一周的下一周的第一天. |
这些主题可以帮助您使用此函数:
主题 | 默认标志/值 | 说明 |
---|---|---|
FirstWeekDay | 6 / 周日 | 定义每周的开始日期。 |
示例 1 – 没有其他参数
概述
打开数据加载编辑器,并将下面的加载脚本添加到新选项卡。
加载脚本包含:
-
包含 2022 年 1 月交易集的数据集,该数据集加载到名为 ‘Transactions’ 的表中。
-
设置为 6(星期日)的 FirstWeekDay 系统变量。
-
包含以下内容的前置 Load:
-
inweek() 函数设置为字段 ‘in_week’,用于确定 2022 年 1 月 14 日这一周发生了哪些交易。
-
weekday() 函数设置为字段 ‘week_day’,显示一周中的哪一天对应于每个日期。
-
加载脚本
SET FirstWeekDay=6;
SET DateFormat='MM/DD/YYYY';
Transactions:
Load
*,
weekday(date) as week_day,
inweek(date,'01/14/2022', 0) as in_week
;
Load
*
Inline
[
id,date,amount
8188,'01/02/2022',37.23
8189,'01/05/2022',17.17
8190,'01/06/2022',88.27
8191,'01/08/2022',57.42
8192,'01/09/2022',53.80
8193,'01/10/2022',82.06
8194,'01/11/2022',40.39
8195,'01/12/2022',87.21
8196,'01/13/2022',95.93
8197,'01/14/2022',45.89
8198,'01/15/2022',36.23
8199,'01/16/2022',25.66
8200,'01/17/2022',82.77
8201,'01/18/2022',69.98
8202,'01/26/2022',76.11
8203,'01/27/2022',25.12
8204,'01/28/2022',46.23
8205,'01/29/2022',84.21
8206,'01/30/2022',96.24
8207,'01/31/2022',67.67
];
结果
加载数据并打开工作表。创建新表并将这些字段添加为维度:
-
date
-
week_day
-
in_week
日期 | week_day | in_week |
---|---|---|
01/02/2022 | Sun | 0 |
01/05/2022 | Wed | 0 |
01/06/2022 | Thu | 0 |
01/08/2022 | Sat | 0 |
01/09/2022 | Sun | -1 |
01/10/2022 | Mon | -1 |
01/11/2022 | Tue | -1 |
01/12/2022 | Wed | -1 |
01/13/2022 | Thu | -1 |
01/14/2022 | Fri | -1 |
01/15/2022 | Sat | -1 |
01/16/2022 | Sun | 0 |
01/17/2022 | Mon | 0 |
01/18/2022 | Tue | 0 |
01/26/2022 | Wed | 0 |
01/27/2022 | Thu | 0 |
01/28/2022 | Fri | 0 |
01/29/2022 | Sat | 0 |
01/30/2022 | Sun | 0 |
01/31/2022 | Mon | 0 |
in_week 字段是在前置 Load 语句中使用 inweek() 函数创建的。第一个参数标识正在评估的字段。第二个参数是硬编码日期,1 月 14 日,其为 base_date。base_date 参数与 FirstWeekDay 系统变量配合使用,以标识比较周。为 0 的 period_no - 这意味着该函数不是分段周之前或之后的比较周,而是最后一个参数。
FirstWeekDay 系统变量确定星期从星期日开始,到星期六结束。因此,根据下图,1 月将分为几周,1 月 9 日至 15 日之间的日期为 inweek() 计算的有效期:
1 月 9 日至 1月 15 日之间发生的任何交易都将返回布尔值结果 TRUE。
示例 2 – period_no
概述
打开数据加载编辑器,并将下面的加载脚本添加到新选项卡。
加载脚本包含:
-
包含 2022 年交易集的相同数据集,该数据集加载到名为 Transactions 的表中。
-
设置为 6(星期日)的 FirstWeekDay 系统变量。
-
包含以下内容的前置 Load:
-
inweek () 函数设置为字段 ‘prev_week’,用于确定 2022 年 1 月 14 日这一周之前的整周发生了哪些交易。
-
weekday() 函数设置为字段 ‘week_day’,显示一周中的哪一天对应于每个日期。
-
加载脚本
SET FirstWeekDay=6;
SET DateFormat='MM/DD/YYYY';
Transactions:
Load
*,
weekday(date) as week_day,
inweek(date,'01/14/2022', -1) as prev_week
;
Load
*
Inline
[
id,date,amount
8188,'01/02/2022',37.23
8189,'01/05/2022',17.17
8190,'01/06/2022',88.27
8191,'01/08/2022',57.42
8192,'01/09/2022',53.80
8193,'01/10/2022',82.06
8194,'01/11/2022',40.39
8195,'01/12/2022',87.21
8196,'01/13/2022',95.93
8197,'01/14/2022',45.89
8198,'01/15/2022',36.23
8199,'01/16/2022',25.66
8200,'01/17/2022',82.77
8201,'01/18/2022',69.98
8202,'01/26/2022',76.11
8203,'01/27/2022',25.12
8204,'01/28/2022',46.23
8205,'01/29/2022',84.21
8206,'01/30/2022',96.24
8207,'01/31/2022',67.67
];
结果
加载数据并打开工作表。创建新表并将这些字段添加为维度:
-
date
-
week_day
-
prev_week
日期 | week_day | prev_week |
---|---|---|
01/02/2022 | Sun | -1 |
01/05/2022 | Wed | -1 |
01/06/2022 | Thu | -1 |
01/08/2022 | Sat | -1 |
01/09/2022 | Sun | 0 |
01/10/2022 | Mon | 0 |
01/11/2022 | Tue | 0 |
01/12/2022 | Wed | 0 |
01/13/2022 | Thu | 0 |
01/14/2022 | Fri | 0 |
01/15/2022 | Sat | 0 |
01/16/2022 | Sun | 0 |
01/17/2022 | Mon | 0 |
01/18/2022 | Tue | 0 |
01/26/2022 | Wed | 0 |
01/27/2022 | Thu | 0 |
01/28/2022 | Fri | 0 |
01/29/2022 | Sat | 0 |
01/30/2022 | Sun | 0 |
01/31/2022 | Mon | 0 |
将 -1 用作 inweek() 函数中的 period_no 参数将比较周的边界向后移动全部七天。在具有为 0 的 period_no 的情况下,一周的时间将在1月9日至15日之间。但在本例中,为 -1 的 period_no 将此段的开始和结束边界向后移动一周。日期边界为 1 月 2 日至 1 月 8 日。
因此,1 月 2 日至 1 月 8 日之间发生的任何交易都将返回布尔值结果 TRUE。
示例 3 – first_week_day
概述
打开数据加载编辑器,并将下面的加载脚本添加到新选项卡。
加载脚本包含:
-
包含 2022 年交易集的相同数据集,该数据集加载到名为 Transactions 的表中。
-
设置为 6(星期日)的 FirstWeekDay 系统变量。
-
包含以下内容的前置 Load:
-
inweek() 函数设置为字段 ‘in_week’,用于确定 2022 年 1 月 14 日这一周发生了哪些交易。
-
weekday() 函数设置为字段 ‘week_day’,显示一周中的哪一天对应于每个日期。
-
加载脚本
SET FirstWeekDay=6;
SET DateFormat='MM/DD/YYYY';
Transactions:
Load
*,
weekday(date) as week_day,
inweek(date,'01/14/2022', 0, 0) as in_week
;
Load
*
Inline
[
id,date,amount
8188,'01/02/2022',37.23
8189,'01/05/2022',17.17
8190,'01/06/2022',88.27
8191,'01/08/2022',57.42
8192,'01/09/2022',53.80
8193,'01/10/2022',82.06
8194,'01/11/2022',40.39
8195,'01/12/2022',87.21
8196,'01/13/2022',95.93
8197,'01/14/2022',45.89
8198,'01/15/2022',36.23
8199,'01/16/2022',25.66
8200,'01/17/2022',82.77
8201,'01/18/2022',69.98
8202,'01/26/2022',76.11
8203,'01/27/2022',25.12
8204,'01/28/2022',46.23
8205,'01/29/2022',84.21
8206,'01/30/2022',96.24
8207,'01/31/2022',67.67
];
结果
加载数据并打开工作表。创建新表并将这些字段添加为维度:
-
date
-
week_day
-
in_week
日期 | week_day | in_week |
---|---|---|
01/02/2022 | Sun | 0 |
01/05/2022 | Wed | 0 |
01/06/2022 | Thu | 0 |
01/08/2022 | Sat | 0 |
01/09/2022 | Sun | 0 |
01/10/2022 | Mon | -1 |
01/11/2022 | Tue | -1 |
01/12/2022 | Wed | -1 |
01/13/2022 | Thu | -1 |
01/14/2022 | Fri | -1 |
01/15/2022 | Sat | -1 |
01/16/2022 | Sun | -1 |
01/17/2022 | Mon | 0 |
01/18/2022 | Tue | 0 |
01/26/2022 | Wed | 0 |
01/27/2022 | Thu | 0 |
01/28/2022 | Fri | 0 |
01/29/2022 | Sat | 0 |
01/30/2022 | Sun | 0 |
01/31/2022 | Mon | 0 |
通过在 inweek() 函数中使用 0 作为 first_week_day 参数,该参数将取代 FirstWeekDay 系统变量,并将星期一设置为一周的第一天。
因此,1 月 10 日和 16 日之间发生的任何交易都将返回布尔值结果 TRUE。
示例 4 – 图表对象示例
概述
使用与第一个 相同的数据集和场景。
然而,在本例中,未更改的数据集被加载到应用程序中。在结果表中创建一个度量,以确定 2022 年 1 月 14 日这一周发生了哪些交易。
加载脚本
SET FirstWeekDay=6;
SET DateFormat='MM/DD/YYYY';
Transactions:
Load
*
Inline
[
id,date,amount
8188,'01/02/2022',37.23
8189,'01/05/2022',17.17
8190,'01/06/2022',88.27
8191,'01/08/2022',57.42
8192,'01/09/2022',53.80
8193,'01/10/2022',82.06
8194,'01/11/2022',40.39
8195,'01/12/2022',87.21
8196,'01/13/2022',95.93
8197,'01/14/2022',45.89
8198,'01/15/2022',36.23
8199,'01/16/2022',25.66
8200,'01/17/2022',82.77
8201,'01/18/2022',69.98
8202,'01/26/2022',76.11
8203,'01/27/2022',25.12
8204,'01/28/2022',46.23
8205,'01/29/2022',84.21
8206,'01/30/2022',96.24
8207,'01/31/2022',67.67
];
结果
加载数据并打开工作表。创建新表并将该字段添加为维度:
-
date
创建以下度量:
-
=inweek (date,'01/14/2022',0),用于计算交易是否发生在 1 月 14 日的同一周。
-
=weekday(date),用于显示每个日期对应一周中的哪一天。
日期 | week_day | =inweek (date,'01/14/2022',0) |
---|---|---|
01/02/2022 | Sun | 0 |
01/05/2022 | Wed | 0 |
01/06/2022 | Thu | 0 |
01/08/2022 | Sat | 0 |
01/09/2022 | Sun | -1 |
01/10/2022 | Mon | -1 |
01/11/2022 | Tue | -1 |
01/12/2022 | Wed | -1 |
01/13/2022 | Thu | -1 |
01/14/2022 | Fri | -1 |
01/15/2022 | Sat | -1 |
01/16/2022 | Sun | 0 |
01/17/2022 | Mon | 0 |
01/18/2022 | Tue | 0 |
01/26/2022 | Wed | 0 |
01/27/2022 | Thu | 0 |
01/28/2022 | Fri | 0 |
01/29/2022 | Sat | 0 |
01/30/2022 | Sun | 0 |
01/31/2022 | Mon | 0 |
通过使用 inweek() 函数在图表中创建 ‘in_week’ 度量。第一个参数标识正在评估的字段。第二个参数是硬编码日期,1 月 14 日,其为 base_date。base_date 参数与 FirstWeekDay 系统变量配合使用,以标识比较周。0 的 period_no 为最终参数。
FirstWeekDay 系统变量确定星期从星期日开始,到星期六结束。因此,根据下图,1 月将分为几周,1 月 9 日至 15 日之间的日期为 inweek() 计算的有效期:
1 月 9 日至 1月 15 日之间发生的任何交易都将返回布尔值结果 TRUE。
示例 5 – 场景
概述
打开数据加载编辑器,并将下面的加载脚本添加到新选项卡。
加载脚本包含:
-
加载到名为 ‘Products’ 的表中的数据集。
-
表格包含以下字段:
-
产品 ID
-
产品类型
-
制造日期
-
成本价
-
已确定,由于设备错误,1 月 12 日一周内生产的产品存在缺陷。最终用户想要一个图表,它按周显示生产的产品是“有缺陷”还是“无缺陷”的状态,以及该周生产的产品的成本。
加载脚本
Products:
Load
*
Inline
[
product_id,manufacture_date,cost_price
8188,'01/02/2022',37.23
8189,'01/05/2022',17.17
8190,'01/06/2022',88.27
8191,'01/08/2022',57.42
8192,'01/09/2022',53.80
8193,'01/10/2022',82.06
8194,'01/11/2022',40.39
8195,'01/12/2022',87.21
8196,'01/13/2022',95.93
8197,'01/14/2022',45.89
8198,'01/15/2022',36.23
8199,'01/16/2022',25.66
8200,'01/17/2022',82.77
8201,'01/18/2022',69.98
8202,'01/26/2022',76.11
8203,'01/27/2022',25.12
8204,'01/28/2022',46.23
8205,'01/29/2022',84.21
8206,'01/30/2022',96.24
8207,'01/31/2022',67.67
];
结果
加载数据并打开工作表。创建新表并将该字段添加为维度:
-
=weekname(manufacture_date)
创建以下度量:
-
=if(only(inweek(manufacture_date,makedate(2022,01,12),0)),'Defective','Faultless'),用于使用 inweek() 函数识别哪些产品有缺陷,哪些无缺陷:
-
=sum(cost_price),用于显示每个产品的成本总和。
执行以下操作:
-
将度量的数字格式设置为金额。
-
在外观下,关闭总计。
weekname(manufacture_date) | =if(only(inweek(manufacture_date,makedate(2022,01,12),0)), 'Defective','Faultless') | Sum(cost_price) |
---|---|---|
2022/02 | Faultless | 200.09 |
2022/03 | Defective | 441.51 |
2022/04 | Faultless | 178.41 |
2022/05 | Faultless | 231.67 |
2022/06 | Faultless | 163.91 |
inweek() 函数在评估每个产品的制造日期时返回布尔值。对于 1 月 12 日所在周生产的任何产品,inweek() 函数返回布尔值 TRUE,并将产品标记为 ‘Defective’。对于任何返回 FALSE 值的产品,由于不是在该周制造的,它将产品标记为 ‘Faultless’。