monthsend - 脚本和图表函数
此函数用于返回与包含基准日期的一个月、两个月、季度、四个月期间或半年的最后毫秒的时间戳对应的值。另外,它也可以用于判断上一个或下一个时间周期末的时间戳。默认输出格式是在脚本中设置的 DateFormat。
语法:
MonthsEnd(n_months, date[, period_no [, first_month_of_year]])
返回数据类型: 双
参数 | 描述 |
---|---|
n_months | 用于定义时段的月数。整数或解算为整数的表达式必须为下列之一:1(相当于 inmonth() 函数)、2(两个月)、3(相当于 inquarter()函数)、4(四个月期间)或 6(半年)。 |
date | 要评估的日期或时间戳。 |
period_no | 该周期可通过 period_no 偏移,其为整数,或解算为整数的表达式,其中值 0 表示该周期包含 base_date。period_no 为负数表示前几个时段,为正数则表示随后的几个时段。 |
first_month_of_year |
如果您不想从一月开始处理(财政)年,可在 first_month_of_year 中指定一个介于 2 和 12 之间的值。 |
monthsend() 函数根据提供的 n_months 参数将一年划分为若干段。然后,它评估所提供的每个日期属于哪个段,并以日期格式返回该段的最后一毫秒。该函数可以从前面或后面的段返回结束时间戳,并重新定义一年的第一个月。
函数中提供了一年中的以下时段作为 n_month 参数。
期间 | 月数 |
---|---|
月 | 1 |
双月 | 2 |
季 | 3 |
四个月 | 4 |
半年 | 6 |
适用场景
当用户希望计算使用到目前为止已过的一月的部分时,monthsend() 函数用作表达式的一部分。用户有机会使用变量选择自己选择的时段。例如,monthsend() 可以提供一个输入变量,让用户计算月份、季度或半年内尚未发生的总利息。
区域设置
除非另有规定,本主题中的示例使用以下日期格式:MM/DD/YYYY。日期格式已经在数据加载脚本中的 SET DateFormat 语句中指定。由于区域设置和其他因素,系统中的默认日期格式可能有所不同。您可以更改以下示例中的格式以满足您的要求。或者,您可以更改加载脚本中的格式以匹配这些示例。
应用程序中的默认区域设置基于安装 Qlik Sense 的计算机或服务器的区域系统设置。如果您访问的 Qlik Sense 服务器设置为瑞典,则数据加载编辑器将使用瑞典地区设置的日期、时间和货币。这些区域格式设置与 Qlik Sense 用户界面中显示的语言无关。Qlik Sense 将以与您使用的浏览器相同的语言显示。
示例 | 结果 |
---|---|
monthsend(4, '07/19/2013') | 返回 08/31/2013。 |
monthsend(4, '10/19/2013', -1) | 返回 08/31/2013。 |
monthsend(4, '10/19/2013', 0, 2) | 返回 01/31/2014。 因为该年度的开始变成 2 月。 |
示例 1 – 基本示例
概述
打开数据加载编辑器,并将下面的加载脚本添加到新选项卡。
加载脚本包含:
-
包含 2022 年交易集的数据集,该数据集加载到名为 Transactions 的表中。
-
以 DateFormat 系统变量 (MM/DD/YYYY) 格式提供的日期字段。
-
前面的 LOAD 语句包含:
-
设置为 ‘bi_monthly_end’ 字段的 monthsend 函数。这将交易分为两个月的部分。
-
timestamp 函数,返回每个交易的时段的开始时间戳。
-
加载脚本
SET DateFormat='MM/DD/YYYY';
Transactions:
Load
*,
monthsend(2,date) as bi_monthly_end,
timestamp(monthsend(2,date)) as bi_monthly_end_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/22/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
];
结果
加载数据并打开工作表。创建新表并将这些字段添加为维度:
-
id
-
date
-
bi_monthly_end
-
bi_monthly_end_timestamp
id | 日期 | bi_monthly_end | bi_monthly_end_timestamp |
---|---|---|---|
8188 | 1/7/2022 | 02/28/2022 | 2/28/2022 11:59:59 PM |
8189 | 1/19/2022 | 02/28/2022 | 2/28/2022 11:59:59 PM |
8190 | 2/5/2022 | 02/28/2022 | 2/28/2022 11:59:59 PM |
8191 | 2/28/2022 | 02/28/2022 | 2/28/2022 11:59:59 PM |
8192 | 3/16/2022 | 04/30/2022 | 4/30/2022 11:59:59 PM |
8193 | 4/1/2022 | 04/30/2022 | 4/30/2022 11:59:59 PM |
8194 | 5/7/2022 | 06/30/2022 | 6/30/2022 11:59:59 PM |
8195 | 5/22/2022 | 06/30/2022 | 6/30/2022 11:59:59 PM |
8196 | 6/15/2022 | 06/30/2022 | 6/30/2022 11:59:59 PM |
8197 | 6/26/2022 | 06/30/2022 | 6/30/2022 11:59:59 PM |
8198 | 7/9/2022 | 08/31/2022 | 8/31/2022 11:59:59 PM |
8199 | 7/22/2022 | 08/31/2022 | 8/31/2022 11:59:59 PM |
8200 | 7/23/2022 | 08/31/2022 | 8/31/2022 11:59:59 PM |
8201 | 7/27/2022 | 08/31/2022 | 8/31/2022 11:59:59 PM |
8202 | 8/2/2022 | 08/31/2022 | 8/31/2022 11:59:59 PM |
8203 | 8/8/2022 | 08/31/2022 | 8/31/2022 11:59:59 PM |
8204 | 8/19/2022 | 08/31/2022 | 8/31/2022 11:59:59 PM |
8205 | 9/26/2022 | 10/31/2022 | 10/31/2022 11:59:59 PM |
8206 | 10/14/2022 | 10/31/2022 | 10/31/2022 11:59:59 PM |
8207 | 10/29/2022 | 10/31/2022 | 10/31/2022 11:59:59 PM |
bi_monthly_end 字段是在前面的 LOAD 语句中使用 monthsend() 函数创建的。提供的第一个参数是 2,将一年分成两个月的段。第二个参数标识要计算的字段。
交易 8195 发生在 5 月 22 日。monthsend() 函数最初将一年划分为两个月的段。交易 8195 发生在 5 月至 6 月期间。因此,该函数返回此段的最后一毫秒,即 06/30/2022 11:59:59 PM。
示例 2 – period_no
概述
使用与第一个 相同的数据集和场景。
在本例中,任务是创建一个字段 ‘prev_bi_monthly_end’,该字段返回交易发生前的双月段的第一毫秒。
加载脚本
SET DateFormat='MM/DD/YYYY';
Transactions:
Load
*,
monthsend(2,date,-1) as prev_bi_monthly_end,
timestamp(monthsend(2,date,-1)) as prev_bi_monthly_end_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/22/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
];
结果
加载数据并打开工作表。创建新表并将这些字段添加为维度:
-
id
-
date
-
prev_bi_monthly_end
-
prev_bi_monthly_end_timestamp
id | 日期 | prev_bi_monthly_end | prev_bi_monthly_end_timestamp |
---|---|---|---|
8188 | 1/7/2022 | 12/31/2021 | 12/31/2021 11:59:59 PM |
8189 | 1/19/2022 | 12/31/2021 | 12/31/2021 11:59:59 PM |
8190 | 2/5/2022 | 12/31/2021 | 12/31/2021 11:59:59 PM |
8191 | 2/28/2022 | 12/31/2021 | 12/31/2021 11:59:59 PM |
8192 | 3/16/2022 | 02/28/2022 | 2/28/2022 11:59:59 PM |
8193 | 4/1/2022 | 02/28/2022 | 2/28/2022 11:59:59 PM |
8194 | 5/7/2022 | 04/30/2022 | 4/30/2022 11:59:59 PM |
8195 | 5/22/2022 | 04/30/2022 | 4/30/2022 11:59:59 PM |
8196 | 6/15/2022 | 04/30/2022 | 4/30/2022 11:59:59 PM |
8197 | 6/26/2022 | 04/30/2022 | 4/30/2022 11:59:59 PM |
8198 | 7/9/2022 | 06/30/2022 | 6/30/2022 11:59:59 PM |
8199 | 7/22/2022 | 06/30/2022 | 6/30/2022 11:59:59 PM |
8200 | 7/23/2022 | 06/30/2022 | 6/30/2022 11:59:59 PM |
8201 | 7/27/2022 | 06/30/2022 | 6/30/2022 11:59:59 PM |
8202 | 8/2/2022 | 06/30/2022 | 6/30/2022 11:59:59 PM |
8203 | 8/8/2022 | 06/30/2022 | 6/30/2022 11:59:59 PM |
8204 | 8/19/2022 | 06/30/2022 | 6/30/2022 11:59:59 PM |
8205 | 9/26/2022 | 08/31/2022 | 8/31/2022 11:59:59 PM |
8206 | 10/14/2022 | 08/31/2022 | 8/31/2022 11:59:59 PM |
8207 | 10/29/2022 | 08/31/2022 | 8/31/2022 11:59:59 PM |
通过在 monthsend() 函数中使用 -1 作为 period_no 参数,在最初将一年划分为双月段之后,该函数返回上一个双月段的最后一毫秒,直到交易发生。
交易 8195 发生在 5 月至 6 月期间。因此,上一个双月段在 3 月 1 日至 4 月 30 日之间,因此函数返回该段的最后一毫秒,即 2022 年 4 月 30 号晚上 11:59:59。
示例 3 – first_month_of_year
概述
使用与第一个 相同的数据集和场景。
在本例中,组织策略是将四月作为财政年度的第一个月。
创建一个字段 ‘bi_monthly_end’,该字段将交易分组为两个月一次的段,并返回每个交易段的最后毫秒时间戳。
加载脚本
SET DateFormat='MM/DD/YYYY';
Transactions:
Load
*,
monthsend(2,date,0,4) as bi_monthly_end,
timestamp(monthsend(2,date,0,4)) as bi_monthly_end_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/22/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
];
结果
加载数据并打开工作表。创建新表并将这些字段添加为维度:
-
id
-
date
-
bi_monthly_end
-
bi_monthly_end_timestamp
id | 日期 | bi_monthly_end | bi_monthly_end_timestamp |
---|---|---|---|
8188 | 1/7/2022 | 01/31/2022 | 1/31/2022 11:59:59 PM |
8189 | 1/19/2022 | 01/31/2022 | 1/31/2022 11:59:59 PM |
8190 | 2/5/2022 | 03/31/2022 | 3/31/2022 11:59:59 PM |
8191 | 2/28/2022 | 03/31/2022 | 3/31/2022 11:59:59 PM |
8192 | 3/16/2022 | 03/31/2022 | 3/31/2022 11:59:59 PM |
8193 | 4/1/2022 | 05/31/2022 | 5/31/2022 11:59:59 PM |
8194 | 5/7/2022 | 05/31/2022 | 5/31/2022 11:59:59 PM |
8195 | 5/22/2022 | 05/31/2022 | 5/31/2022 11:59:59 PM |
8196 | 6/15/2022 | 07/31/2022 | 7/31/2022 11:59:59 PM |
8197 | 6/26/2022 | 07/31/2022 | 7/31/2022 11:59:59 PM |
8198 | 7/9/2022 | 07/31/2022 | 7/31/2022 11:59:59 PM |
8199 | 7/22/2022 | 07/31/2022 | 7/31/2022 11:59:59 PM |
8200 | 7/23/2022 | 07/31/2022 | 7/31/2022 11:59:59 PM |
8201 | 7/27/2022 | 07/31/2022 | 7/31/2022 11:59:59 PM |
8202 | 8/2/2022 | 09/30/2022 | 9/30/2022 11:59:59 PM |
8203 | 8/8/2022 | 09/30/2022 | 9/30/2022 11:59:59 PM |
8204 | 8/19/2022 | 09/30/2022 | 9/30/2022 11:59:59 PM |
8205 | 9/26/2022 | 09/30/2022 | 9/30/2022 11:59:59 PM |
8206 | 10/14/2022 | 11/30/2022 | 11/30/2022 11:59:59 PM |
8207 | 10/29/2022 | 11/30/2022 | 11/30/2022 11:59:59 PM |
通过在 monthsend() 函数中使用 4 作为 first_month_of_year 参数,函数从 4 月 1 日开始一年。然后它将一年分成四个季度。4 月至 5 月、6 月至 7 月、8 月至 9 月、10 月至 11 月、12 月至 1 月、2 月至 3 月。
交易 8195 发生在 5 月 22 日,属于 4 月 1 日至 5 月 31 日期间。因此,该函数返回此段的最后一毫秒,即 05/31/2022 11:59:59 PM。
示例 4 – 图表对象示例
概述
使用与第一个 相同的数据集和场景。然而,在本例中,未更改的数据集被加载到应用程序中。
在本例中,任务是创建一个计算,将交易分组为两个月的交易段,并返回每个交易段的最后一毫秒时间戳,作为应用程序的图表对象中的度量。
加载脚本
SET DateFormat='MM/DD/YYYY';
Transactions:
Load
*
Inline
[
id,date,amount
8188,2/19/2022,37.23
8189,3/7/2022,17.17
8190,3/30/2022,88.27
8191,4/5/2022,57.42
8192,4/16/2022,53.80
8193,5/1/2022,82.06
8194,5/7/2022,40.39
8195,5/22/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
要获取交易发生时双月段的最后一毫秒时间戳,请创建以下度量:
-
=monthsEnd(2,date)
-
=timestamp(monthsend(2,date))
id | 日期 | =monthsend(2,date) | =timestamp(monthsend(2,date)) |
---|---|---|---|
8188 | 1/7/2022 | 02/28/2022 | 2/28/2022 11:59:59 PM |
8189 | 1/19/2022 | 02/28/2022 | 2/28/2022 11:59:59 PM |
8190 | 2/5/2022 | 02/28/2022 | 2/28/2022 11:59:59 PM |
8191 | 2/28/2022 | 02/28/2022 | 2/28/2022 11:59:59 PM |
8192 | 3/16/2022 | 04/30/2022 | 4/30/2022 11:59:59 PM |
8193 | 4/1/2022 | 04/30/2022 | 4/30/2022 11:59:59 PM |
8194 | 5/7/2022 | 06/30/2022 | 6/30/2022 11:59:59 PM |
8195 | 5/22/2022 | 06/30/2022 | 6/30/2022 11:59:59 PM |
8196 | 6/15/2022 | 06/30/2022 | 6/30/2022 11:59:59 PM |
8197 | 6/26/2022 | 06/30/2022 | 6/30/2022 11:59:59 PM |
8198 | 7/9/2022 | 08/31/2022 | 8/31/2022 11:59:59 PM |
8199 | 7/22/2022 | 08/31/2022 | 8/31/2022 11:59:59 PM |
8200 | 7/23/2022 | 08/31/2022 | 8/31/2022 11:59:59 PM |
8201 | 7/27/2022 | 08/31/2022 | 8/31/2022 11:59:59 PM |
8202 | 8/2/2022 | 08/31/2022 | 8/31/2022 11:59:59 PM |
8203 | 8/8/2022 | 08/31/2022 | 8/31/2022 11:59:59 PM |
8204 | 8/19/2022 | 08/31/2022 | 8/31/2022 11:59:59 PM |
8205 | 9/26/2022 | 10/31/2022 | 10/31/2022 11:59:59 PM |
8206 | 10/14/2022 | 10/31/2022 | 10/31/2022 11:59:59 PM |
8207 | 10/29/2022 | 10/31/2022 | 10/31/2022 11:59:59 PM |
通过使用 monthsend() 函数在图表对象中创建 ‘bi_monthly_end’ 字段作为度量。提供的第一个参数是 2,将一年分成两个月的段。第二个参数标识要计算的字段。
交易 8195 发生在 5 月 22 日。monthsend() 函数最初将一年划分为两个月的段。交易 8195 发生在 5 月至 6 月期间。因此,该函数返回此段的第一毫秒,即 06/30/2022 11:59:59 PM。
示例 5 – 场景
概述
打开数据加载编辑器,并将下面的加载脚本添加到新选项卡。
在本例中,将数据集加载到名为 ‘Employee_Expenses’ 的表中。表格包含以下字段:
-
员工 ID
-
员工姓名
-
每位员工的平均每日费用报销。
最终用户想要一个图表,该图表按员工 id 和员工姓名显示他们自己选择的剩余时间段的估计费用索赔。财政年度从一月份开始。
加载脚本
SET vPeriod = 1;
Employee_Expenses:
Load
*
Inline
[
employee_id,employee_name,avg_daily_claim
182,Mark, $15
183,Deryck, $12.5
184,Dexter, $12.5
185,Sydney,$27
186,Agatha,$18
];
结果
加载数据并打开新工作表。
在加载脚本开始时,创建了一个变量 vPeriod,该变量将绑定到变量输入控件。
进行以下操作:
-
在资产面板中,单击自定义对象。
-
选择 Qlik 仪表板捆绑,并创建变量输入对象。
-
输入图表对象的标题。
-
在变量下,选择 vPeriod 作为名称,并将对象设置为显示为下拉列表。
-
在值下,单击动态值。输入以下内容:
='1~month|2~bi-month|3~quarter|4~tertial|6~half-year'.
创建新表并将这些字段创建为维度:
-
employee_id
-
employee_name
要计算累计利息,请创建该度量:
=floor(monthsend($(vPeriod),today(1))-today(1))*avg_daily_claim
将度量的数字格式设置为金额。
EmployeeID | employee_name | =floor(monthsend($(vPeriod),today(1))-today(1))*avg_daily_claim |
---|---|---|
182 | Mark | $1410.00 |
183 | Deryck | $1175.00 |
184 | Dexter | $1175.00 |
185 | Sydney | $2538.00 |
186 | Agatha | $1692.00 |
monthsend() 函数使用用户输入作为其第一个参数,使用今天的日期作为其第二个参数。这将返回用户所选时间段的结束日期。然后,表达式通过从该结束日期减去今天的日期,返回所选时间段剩余的天数。
然后将该值乘以每个员工的平均每日费用索赔,以计算每个员工在该期间剩余天预计提出的索赔的估计值。