inweektodate - 脚本和图表函数
此函数用于返回 True,如果 timestamp 位于包含 base_date 为止以及包括 base_date 最后毫秒的星期部分以内。
语法:
InWeekToDate (timestamp, base_date, period_no [, first_week_day])
返回数据类型: 布尔值
在 Qlik Sense 中,布尔 true 值由 -1 表示,false 值由 0 表示。
inweektodate() 函数使用 base_date 参数来识别一周段的最大边界日期,以及基于 FirstWeekDay 系统变量(或用户定义的 first_week_day 参数)的一周开始的相应日期。定义本周段后,当将规定的日期值与该段进行比较时,函数将返回布尔结果。
适用场景
inweektodate() 函数返回布尔结果。通常,这种类型的函数将用作 if 表达式中的条件。这将返回一个聚合或计算,这取决于评估的日期是否发生在特定日期之前的一周内。
例如,inweektodate() 函数可用于计算截至特定日期的指定周内的所有销售额。
参数 | 说明 |
---|---|
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。
|
示例 | 交互 |
---|---|
inweektodate('01/12/2006', '01/12/2006', 0) | 返回 TRUE。 |
inweektodate('01/12/2006', '01/11/2006', 0) | 返回 FALSE。 |
inweektodate('01/12/2006', '01/18/2006', -1) | 返回 FALSE。 由于将 period_no 指定为 -1,作为衡量 timestamp 的依据的有效日期为 01/11/2006。 |
inweektodate('01/11/2006', '01/12/2006', 0, 3 ) | 返回 FALSE,由于将 first_week_day 指定为 3(星期四),这使得本周的第一天 01/12/2006 之后一周包含 01/12/2006。 |
这些主题可以帮助您使用此函数:
主题 | 默认标志/值 | 说明 |
---|---|---|
FirstWeekDay | 6 / 周日 | 定义每周的开始日期。 |
区域设置
除非另有规定,本主题中的示例使用以下日期格式:MM/DD/YYYY。日期格式已经在数据加载脚本中的 SET DateFormat 语句中指定。由于区域设置和其他因素,系统中的默认日期格式可能有所不同。您可以更改以下示例中的格式以满足您的要求。或者,您可以更改加载脚本中的格式以匹配这些示例。有关详细信息,请参阅修改应用程序和脚本的区域设置。
应用程序中的默认区域设置基于用户配置文件。这些区域格式设置与 Qlik Cloud 用户界面中显示的语言无关。Qlik Cloud 将以与您使用的浏览器相同的语言显示。
如果你是应用程序创建者,你可以为自己创建的应用程序设置默认区域。有关更多信息,请参阅设置 Qlik Cloud 分析 中创建应用程序和脚本所用的首选区域设置。
示例 1 – 没有其他参数
概述
打开数据加载编辑器,并将下面的加载脚本添加到新选项卡。
加载脚本包含:
-
包含 2022 年 1 月交易集的数据集,该数据集加载到名为 Transactions 的表中。
-
以格式 TimestampFormat='M/D/YYYY h:mm:ss[.fff]' 提供数据字段。
-
创建一个字段 in_week_to_date,用于确定截至 2022 年 1 月 14 日的周内发生了哪些交易。
-
使用 weekday() 函数创建另一个名为 weekday 的字段。创建此新字段是为了显示每个日期对应一周中的哪一天。
加载脚本
SET TimestampFormat='M/D/YYYY h:mm:ss[.fff]';
SET FirstWeekDay=6;
Transactions:
Load
*,
weekday(date) as week_day,
inweektodate(date,'01/14/2022', 0) as in_week_to_date
;
Load
*
Inline
[
id,date,amount
8188,'2022-01-02 12:22:06',37.23
8189,'2022-01-05 01:02:30',17.17
8190,'2022-01-06 15:36:20',88.27
8191,'2022-01-08 10:58:35',57.42
8192,'2022-01-09 08:53:32',53.80
8193,'2022-01-10 21:13:01',82.06
8194,'2022-01-11 00:57:13',40.39
8195,'2022-01-12 09:26:02',87.21
8196,'2022-01-13 15:05:09',95.93
8197,'2022-01-14 18:44:57',45.89
8198,'2022-01-15 06:10:46',36.23
8199,'2022-01-16 06:39:27',25.66
8200,'2022-01-17 10:44:16',82.77
8201,'2022-01-18 18:48:17',69.98
8202,'2022-01-26 04:36:03',76.11
8203,'2022-01-27 08:07:49',25.12
8204,'2022-01-28 12:24:29',46.23
8205,'2022-01-30 11:56:56',84.21
8206,'2022-01-30 14:40:19',96.24
8207,'2022-01-31 05:28:21',67.67
];
结果
加载数据并打开工作表。创建新表并将这些字段添加为维度:
-
date
-
week_day
-
in_week_to_date
日期 | week_day | in_week_to_date |
---|---|---|
2022-01-02 12:22:06 | Sun | 0 |
2022-01-05 01:02:30 | Wed | 0 |
2022-01-06 15:36:20 | Thu | 0 |
2022-01-08 10:58:35 | Sat | 0 |
2022-01-09 08:53:32 | Sun | -1 |
2022-01-10 21:13:01 | Mon | -1 |
2022-01-11 00:57:13 | Tue | -1 |
2022-01-12 09:26:02 | Wed | -1 |
2022-01-13 15:05:09 |
Thu |
-1 |
2022-01-14 18:44:57 | Fri | -1 |
2022-01-15 06:10:46 | Sat | 0 |
2022-01-16 06:39:27 | Sun | 0 |
2022-01-17 10:44:16 | Mon | 0 |
2022-01-18 18:48:17 | Tue | 0 |
2022-01-26 04:36:03 | Wed | 0 |
2022-01-27 08:07:49 | Thu | 0 |
2022-01-28 12:24:29 | Fri | 0 |
2022-01-30 11:56:56 | Sun | 0 |
2022-01-30 14:40:19 | Sun | 0 |
2022-01-31 05:28:21 | Mon | 0 |
in_week_to_date 字段是在前置 Load 语句中使用 inweektodate() 函数创建的。提供的第一个参数标识正在评估的字段。第二个参数是 1 月 14 日的硬编码日期,它是标识要分段的周的 base_date 并定义该分段的结束边界。为 0 的 period_no 是最后一个参数,这意味着该函数不比较分段周之前或之后的周。
FirstWeekDay 系统变量确定星期从星期日开始,到星期六结束。因此,根据下图,1 月将分为几周,1 月 9 日至 14 日之间的日期为 inweekdodate() 计算的有效期:
1 月 9 日至 14 日之间发生的任何交易都将返回布尔值结果 TRUE。日期之前和之后的交易返回的布尔结果为 FALSE。
示例 2 – period_no
概述
打开数据加载编辑器,并将下面的加载脚本添加到新选项卡。
加载脚本包含:
-
与第一个示例相同的数据集和场景。
-
创建一个字段 prev_week_to_date,确定在 2022 年 1 月 14 日结束的周段之前的整个周发生了哪些交易。
-
使用 weekday() 函数创建另一个名为 weekday 的字段。创建此项是为了显示每个日期对应一周中的哪一天。
加载脚本
SET FirstWeekDay=6;
SET TimestampFormat='M/D/YYYY h:mm:ss[.fff]';
Transactions:
Load
*,
weekday(date) as week_day,
inweektodate(date,'01/14/2022', -1) as prev_week_to_date
;
Load
*
Inline
[
id,date,amount
8188,'2022-01-02 12:22:06',37.23
8189,'2022-01-05 01:02:30',17.17
8190,'2022-01-06 15:36:20',88.27
8191,'2022-01-08 10:58:35',57.42
8192,'2022-01-09 08:53:32',53.80
8193,'2022-01-10 21:13:01',82.06
8194,'2022-01-11 00:57:13',40.39
8195,'2022-01-12 09:26:02',87.21
8196,'2022-01-13 15:05:09',95.93
8197,'2022-01-14 18:44:57',45.89
8198,'2022-01-15 06:10:46',36.23
8199,'2022-01-16 06:39:27',25.66
8200,'2022-01-17 10:44:16',82.77
8201,'2022-01-18 18:48:17',69.98
8202,'2022-01-26 04:36:03',76.11
8203,'2022-01-27 08:07:49',25.12
8204,'2022-01-28 12:24:29',46.23
8205,'2022-01-30 11:56:56',84.21
8206,'2022-01-30 14:40:19',96.24
8207,'2022-01-31 05:28:21',67.67
];
结果
加载数据并打开工作表。创建新表并将这些字段添加为维度:
-
date
-
week_day
-
prev_week_to_date
日期 | week_day | prev_week_to_date |
---|---|---|
2022-01-02 12:22:06 | Sun | -1 |
2022-01-05 01:02:30 | Wed | -1 |
2022-01-06 15:36:20 | Thu | -1 |
2022-01-08 10:58:35 | Sat | 0 |
2022-01-09 08:53:32 | Sun | 0 |
2022-01-10 21:13:01 | Mon | 0 |
2022-01-11 00:57:13 | Tue | 0 |
2022-01-12 09:26:02 | Wed | 0 |
2022-01-13 15:05:09 |
Thu |
0 |
2022-01-14 18:44:57 | Fri | 0 |
2022-01-15 06:10:46 | Sat | 0 |
2022-01-16 06:39:27 | Sun | 0 |
2022-01-17 10:44:16 | Mon | 0 |
2022-01-18 18:48:17 | Tue | 0 |
2022-01-26 04:36:03 | Wed | 0 |
2022-01-27 08:07:49 | Thu | 0 |
2022-01-28 12:24:29 | Fri | 0 |
2022-01-30 11:56:56 | Sun | 0 |
2022-01-30 14:40:19 | Sun | 0 |
2022-01-31 05:28:21 | Mon | 0 |
值为 -1 的 period_no 指示 inweektodate () 函数将输入季度段与前一周进行比较。周段最初等于 1 月 9 日至 1 月 14 日之间。然后 period_no 将该段的开始边界和结束边界偏移到一周前,导致日期边界变为 1 月 2 日至 1 月 7 日。
因此,1 月 2 日至 8 日之间(包括 1 月 8 本身日)发生的任何交易都将返回布尔值结果 TRUE。
示例 3 – first_week_day
概述
打开数据加载编辑器,并将下面的加载脚本添加到新选项卡。
加载脚本包含:
-
与第一个示例相同的数据集和场景。
-
创建一个字段 in_week_to_date,用于确定截至 2022 年 1 月 14 日的周内发生了哪些交易。
-
使用 weekday() 函数创建另一个名为 weekday 的字段。创建此项是为了显示每个日期对应一周中的哪一天。
在此示例中,我们使用 Monday 作为一周的第一天。
加载脚本
SET FirstWeekDay=6;
SET TimestampFormat='M/D/YYYY h:mm:ss[.fff]';
Transactions:
Load
*,
weekday(date) as week_day,
inweektodate(date,'01/14/2022', 0, 0) as in_week_to_date
;
Load
*
Inline
[
id,date,amount
8188,'2022-01-02 12:22:06',37.23
8189,'2022-01-05 01:02:30',17.17
8190,'2022-01-06 15:36:20',88.27
8191,'2022-01-08 10:58:35',57.42
8192,'2022-01-09 08:53:32',53.80
8193,'2022-01-10 21:13:01',82.06
8194,'2022-01-11 00:57:13',40.39
8195,'2022-01-12 09:26:02',87.21
8196,'2022-01-13 15:05:09',95.93
8197,'2022-01-14 18:44:57',45.89
8198,'2022-01-15 06:10:46',36.23
8199,'2022-01-16 06:39:27',25.66
8200,'2022-01-17 10:44:16',82.77
8201,'2022-01-18 18:48:17',69.98
8202,'2022-01-26 04:36:03',76.11
8203,'2022-01-27 08:07:49',25.12
8204,'2022-01-28 12:24:29',46.23
8205,'2022-01-30 11:56:56',84.21
8206,'2022-01-30 14:40:19',96.24
8207,'2022-01-31 05:28:21',67.67
];
结果
加载数据并打开工作表。创建新表并将这些字段添加为维度:
-
date
-
week_day
-
in_week_to_date
日期 | week_day | in_week_to_date |
---|---|---|
2022-01-02 12:22:06 | Sun | 0 |
2022-01-05 01:02:30 | Wed | 0 |
2022-01-06 15:36:20 | Thu | 0 |
2022-01-08 10:58:35 | Sat | 0 |
2022-01-09 08:53:32 | Sun | 0 |
2022-01-10 21:13:01 | Mon | -1 |
2022-01-11 00:57:13 | Tue | -1 |
2022-01-12 09:26:02 | Wed | -1 |
2022-01-13 15:05:09 |
Thu |
-1 |
2022-01-14 18:44:57 | Fri | -1 |
2022-01-15 06:10:46 | Sat | 0 |
2022-01-16 06:39:27 | Sun | 0 |
2022-01-17 10:44:16 | Mon | 0 |
2022-01-18 18:48:17 | Tue | 0 |
2022-01-26 04:36:03 | Wed | 0 |
2022-01-27 08:07:49 | Thu | 0 |
2022-01-28 12:24:29 | Fri | 0 |
2022-01-30 11:56:56 | Sun | 0 |
2022-01-30 14:40:19 | Sun | 0 |
2022-01-31 05:28:21 | Mon | 0 |
通过在 inweektodate() 函数中使用 0 作为 first_week_day 参数,函数参数将取代 FirstWeekDay 系统变量,并将星期一设置为一周的第一天。
因此,在 1 月 10 日和 14 日之间发生的任何交易将返回布尔结果 TRUE,而日期在这些边界之外的交易将返回值 FALSE。
示例 4 – 图表对象
概述
打开数据加载编辑器,并将下面的加载脚本添加到新选项卡。
加载脚本包含与第一个示例相同的数据集和场景。然而,在本例中,未更改的数据集被加载到应用程序中。确定截至 2022 年 1 月 14 日的一周内发生了哪些交易的计算将在图表对象中创建为度量。
加载脚本
SET DateFormat='MM/DD/YYYY';
Transactions:
Load
*
Inline
[
id,date,amount
8188,'2022-01-02 12:22:06',37.23
8189,'2022-01-05 01:02:30',17.17
8190,'2022-01-06 15:36:20',88.27
8191,'2022-01-08 10:58:35',57.42
8192,'2022-01-09 08:53:32',53.80
8193,'2022-01-10 21:13:01',82.06
8194,'2022-01-11 00:57:13',40.39
8195,'2022-01-12 09:26:02',87.21
8196,'2022-01-13 15:05:09',95.93
8197,'2022-01-14 18:44:57',45.89
8198,'2022-01-15 06:10:46',36.23
8199,'2022-01-16 06:39:27',25.66
8200,'2022-01-17 10:44:16',82.77
8201,'2022-01-18 18:48:17',69.98
8202,'2022-01-26 04:36:03',76.11
8203,'2022-01-27 08:07:49',25.12
8204,'2022-01-28 12:24:29',46.23
8205,'2022-01-30 11:56:56',84.21
8206,'2022-01-30 14:40:19',96.24
8207,'2022-01-31 05:28:21',67.67
];
结果
执行以下操作:
-
加载数据并打开工作表。创建新表并将该字段添加为维度: date。
-
要计算截至 1 月 14 日的交易是否发生在同一周,请创建以下度量:
=inweektodate(date,'01/14/2022',0)
-
要显示一周中的哪一天对应于每个日期,请创建一个附加度量:
=weekday(date)
日期 | week_day | in_week_to_date |
---|---|---|
2022-01-02 12:22:06 | Sun | 0 |
2022-01-05 01:02:30 | Wed | 0 |
2022-01-06 15:36:20 | Thu | 0 |
2022-01-08 10:58:35 | Sat | 0 |
2022-01-09 08:53:32 | Sun | -1 |
2022-01-10 21:13:01 | Mon | -1 |
2022-01-11 00:57:13 | Tue | -1 |
2022-01-12 09:26:02 | Wed | -1 |
2022-01-13 15:05:09 |
Thu |
-1 |
2022-01-14 18:44:57 | Fri | -1 |
2022-01-15 06:10:46 | Sat | 0 |
2022-01-16 06:39:27 | Sun | 0 |
2022-01-17 10:44:16 | Mon | 0 |
2022-01-18 18:48:17 | Tue | 0 |
2022-01-26 04:36:03 | Wed | 0 |
2022-01-27 08:07:49 | Thu | 0 |
2022-01-28 12:24:29 | Fri | 0 |
2022-01-30 11:56:56 | Sun | 0 |
2022-01-30 14:40:19 | Sun | 0 |
2022-01-31 05:28:21 | Mon | 0 |
通过使用 inweektodate() 函数在图表对象中创建 in_week_to_date 字段作为度量。提供的第一个参数标识正在评估的字段。第二个参数是 1 月 14 日的硬编码日期,它是标识要分段的周的 base_date 并定义该分段的结束边界。为 0 的 period_no 是最后一个参数,这意味着该函数不比较分段周之前或之后的周。
FirstWeekDay 系统变量确定星期从星期日开始,到星期六结束。因此,根据下图,1 月将分为几周,1 月 9 日至 14 日之间的日期为 inweekdodate() 计算的有效期:
1 月 9 日至 14 日之间发生的任何交易都将返回布尔值结果 TRUE。日期之前和之后的交易返回的布尔结果为 FALSE。
示例 5 – 场景
概述
打开数据加载编辑器,并将下面的加载脚本添加到新选项卡。
加载脚本包含:
-
加载到名为 Products 的表中的数据集。
-
有关产品 ID、制造日期和成本价格的信息。
已确定,由于设备错误,1 月 12 日一周内生产的产品存在缺陷。该问题于 1 月 13 日得到解决。最终用户想要一个图表对象,它按周显示生产的产品是“有缺陷”还是“无缺陷”的状态,以及该周生产的产品的成本。
加载脚本
Products:
Load
*
Inline
[
product_id,manufacture_date,cost_price
8188,'2022-01-02 12:22:06',37.23
8189,'2022-01-05 01:02:30',17.17
8190,'2022-01-06 15:36:20',88.27
8191,'2022-01-08 10:58:35',57.42
8192,'2022-01-09 08:53:32',53.80
8193,'2022-01-10 21:13:01',82.06
8194,'2022-01-11 00:57:13',40.39
8195,'2022-01-12 09:26:02',87.21
8196,'2022-01-13 15:05:09',95.93
8197,'2022-01-14 18:44:57',45.89
8198,'2022-01-15 06:10:46',36.23
8199,'2022-01-16 06:39:27',25.66
8200,'2022-01-17 10:44:16',82.77
8201,'2022-01-18 18:48:17',69.98
8202,'2022-01-26 04:36:03',76.11
8203,'2022-01-27 08:07:49',25.12
8204,'2022-01-28 12:24:29',46.23
8205,'2022-01-30 11:56:56',84.21
8206,'2022-01-30 14:40:19',96.24
8207,'2022-01-31 05:28:21',67.67
];
结果
执行以下操作:
-
加载数据并打开工作表。新建表格。创建维度以显示周名称:
=weekname(manufacture_date)
-
接下来,创建一个维度,以确定哪些产品有缺陷,哪些无缺陷:
=if(inWeektodate(manufacture_date,makedate(2022,01,12),0),'Defective','Faultless')
-
创建一个度量来求对产品的 cost_price 求和:
=sum(cost_price)
-
将度量的数字格式设置为金额。
weekname(manufacture_date) | if(inweektodate(manufacture_date,makedate(2022,01,12),0),'Defective','Faultless') | Sum(cost_price) |
---|---|---|
2022/02 | Faultless | $200.09 |
2022/03 | Defective | $263.46 |
2022/03 | Faultless | $178.05 |
2022/04 | Faultless | $178.41 |
2022/05 | Faultless | $147.46 |
2022/06 | Faultless | $248.12 |
inweektodate() 函数在评估每个产品的制造日期时返回布尔值。对于返回布尔值 TRUE 的产品,它将产品标记为 'Defective'。对于返回值为 FALSE 的任何产品(因此在截至 1 月 12 日的一周内未生产),它将产品标记为 ‘Faultless’。