# weekstart - 脚本和图表函数

此函数用于返回与包含 date 的日历周的第一天的第一毫秒时间戳对应的值。默认输出格式是在脚本中设置的 DateFormat。

语法：

WeekStart(timestamp [, period\_no [, first\_week\_day ]])

返回数据类型： 双

`weekstart()` 函数确定日期属于哪个周。然后以日期格式返回该周第一毫秒的时间戳。一周的第一天由 `FirstWeekDay` 环境变量确定。但是，这可以被 `weekstart()` 函数中的 `first_week_day` 参数取代。

参数

| 参数 | 说明 |
| --- | --- |
| timestamp | 要评估的日期或时间戳。 |
| period\_no | shift 为整数，其中值 0 表示该星期包含 date。shift 为负数，表示前几星期，正数表示随后的几星期。 |
| first\_week\_day | 指定一周的开始日期。如果忽略，使用 FirstWeekDay 变量的值。<br><br>可能的值 first\_week\_day 为：周一为 0，周二为 1，周三为 2，周四为3，周五为 4，周六为 5，星期日为 6。<br><br>有关系统变量的详细信息，请参见[FirstWeekDay](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Sense_Hub/Scripting/NumberInterpretationVariables/FirstWeekDay.htm)。 |

## 适用场景

当用户希望计算使用到目前为止已过的一周的部分时，`weekstart()` 函数通常用作表达式的一部分。例如，如果用户想计算员工一周内迄今为止的工资总额，则可以使用它。

以下示例假设：

```
SET FirstWeekDay=0;
```

函数示例

| 示例 | 结果 |
| --- | --- |
| `weekstart('01/12/2013')` | 返回 01/07/2013。 |
| `weekstart('01/12/2013', -1 )` | 返回 11/31/2012。 |
| `weekstart('01/12/2013', 0, 1)` | 返回 01/08/2013。 |

## 区域设置

除非另有规定，本主题中的示例使用以下日期格式：MM/DD/YYYY。日期格式已经在数据加载脚本中的 `SET DateFormat` 语句中指定。由于区域设置和其他因素，系统中的默认日期格式可能有所不同。您可以更改以下示例中的格式以满足您的要求。或者，您可以更改加载脚本中的格式以匹配这些示例。

应用程序中的默认区域设置基于安装 Qlik Sense 的计算机或服务器的区域系统设置。如果您访问的 Qlik Sense 服务器设置为瑞典，则数据加载编辑器将使用瑞典地区设置的日期、时间和货币。这些区域格式设置与 Qlik Sense 用户界面中显示的语言无关。Qlik Sense 将以与您使用的浏览器相同的语言显示。

示例：

如果您想要周和周数的 ISO 设置，请确保脚本中包含以下内容：

```
Set DateFormat   ='YYYY-MM-DD'; 
Set FirstWeekDay =0;    // Monday as first week day
Set BrokenWeeks  =0;    //(use unbroken weeks)
Set ReferenceDay =4;    // Jan 4th is always in week 1
```

如果需要 US 设置，请确保脚本中包含以下内容：

```
Set DateFormat   ='M/D/YYYY';
Set FirstWeekDay =6;    // Sunday as first week day
Set BrokenWeeks  =1;    //(use broken weeks)
Set ReferenceDay =1;    // Jan 1st is always in week 1
```

以上示例从 weekstart() 函数中得出以下结果：

Weekend 函数示例

| 日期 | ISO 周初 | US 周初 |
| --- | --- | --- |
| 2020 年 12 月 26 日星期六 | 2020-12-21 | 12/20/2020 |
| 2020 年 12 月 27 日星期日 | 2020-12-21 | 12/27/2020 |
| 2020 年 12 月 28 日星期一 | 2020-12-28 | 12/27/2020 |
| 2020 年 12 月 29 日星期二 | 2020-12-28 | 12/27/2020 |
| 2020 年 12 月 30 日星期三 | 2020-12-28 | 12/27/2020 |
| 2020 年 12 月 31 日星期四 | 2020-12-28 | 12/27/2020 |
| 2021 年 1 月 1 日星期五 | 2020-12-28 | 12/27/2020 |
| 2021 年 1 月 2 日周六 | 2020-12-28 | 12/27/2020 |
| 2021 年 1 月 3 日星期日 | 2020-12-28 | 1/3/2021 |
| 2021 年 1 月 4 日星期一 | 2021-01-04 | 1/3/2021 |
| 2021 年 1 月 5 日星期二 | 2021-01-04 | 1/3/2021 |

信息注释ISO 列中的周初为星期一，US 列中的周初为星期日。

## 示例 1 – 没有其他参数

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/DateAndTimeFunctions/weekstart.htm)

#### 加载脚本和结果

概述

打开数据加载编辑器，并将下面的加载脚本添加到新选项卡。

加载脚本包含：

* 包含 2022 年交易集的数据集，该数据集加载到名为 Transactions 的表中。

* 日期字段已以 DateFormat 系统变量 (MM/DD/YYYY) 格式提供。

* 创建字段 start\_of\_week，返回交易发生的周开始的时间戳。

加载脚本

```
SET FirstWeekDay=6;

Transactions:
    Load
        *,
        weekstart(date) as start_of_week,
        timestamp(weekstart(date)) as start_of_week_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/16/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

* start\_of\_week

* start\_of\_week\_timestamp

结果表

| 日期 | start\_of\_week | start\_of\_week\_timestamp |
| --- | --- | --- |
| 1/7/2022 | 01/02/2022 | 1/2/2022 12:00:00 AM |
| 1/19/2022 | 01/16/2022 | 1/16/2022 12:00:00 AM |
| 2/5/2022 | 01/30/2022 | 1/30/2022 12:00:00 AM |
| 2/28/2022 | 02/27/2022 | 2/27/2022 12:00:00 AM |
| 3/16/2022 | 03/13/2022 | 3/13/2022 12:00:00 AM |
| 4/1/2022 | 03/27/2022 | 3/27/2022 12:00:00 AM |
| 5/7/2022 | 05/01/2022 | 5/1/2022 12:00:00 AM |
| 5/16/2022 | 05/15/2022 | 5/15/2022 12:00:00 AM |
| 6/15/2022 | 06/12/2022 | 6/12/2022 12:00:00 AM |
| 6/26/2022 | 06/26/2022 | 6/26/2022 12:00:00 AM |
| 7/9/2022 | 07/03/2022 | 7/3/2022 12:00:00 AM |
| 7/22/2022 | 07/17/2022 | 7/17/2022 12:00:00 AM |
| 7/23/2022 | 07/17/2022 | 7/17/2022 12:00:00 AM |
| 7/27/2022 | 07/24/2022 | 7/24/2022 12:00:00 AM |
| 8/2/2022 | 07/31/2022 | 7/31/2022 12:00:00 AM |
| 8/8/2022 | 08/07/2022 | 8/7/2022 12:00:00 AM |
| 8/19/2022 | 08/14/2022 | 8/14/2022 12:00:00 AM |
| 9/26/2022 | 09/25/2022 | 9/25/2022 12:00:00 AM |
| 10/14/2022 | 10/09/2022 | 10/9/2022 12:00:00 AM |
| 10/29/2022 | 10/23/2022 | 10/23/2022 12:00:00 AM |

通过使用 weekstart() 函数并将日期字段作为函数的参数传递，在前置 Load 语句中创建了 start\_of\_week 字段。

weekstart() 函数初始标识日期值属于哪个周，并返回该周第一毫秒的时间戳。

weekstart() 函数图表，示例没有额外参数

weekstart() 函数图表，示例没有额外参数

weekstart()weekstart() 函数图表，示例没有额外参数![显示 weekstart 函数如何将交易日期转换为交易发生周第一一毫秒的时间戳的图。](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Resources/Images/scripting-functions-weekstart-examples-no-add-arg.png)

交易 8191 发生在 2 月 5 日。FirstWeekDay 系统变量将一周的第一天设置为星期日。weekstart() 函数确定 2 月 5 日之前的第一个星期日（因此是一周的开始）是 1 月 30 日。因此，该交易的start\_of\_week 值返回当天的第一毫秒，即 1 月 30 号中午 12:00:00。

## 示例 2 – period\_no

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/DateAndTimeFunctions/weekstart.htm)

#### 加载脚本和结果

概述

打开数据加载编辑器，并将下面的加载脚本添加到新选项卡。

加载脚本包含：

* 与第一个示例相同的数据集和场景。

* 创建一个字段 previous\_week\_start，该字段返回季度发生前的季度开始的时间戳。

加载脚本

```
SET DateFormat='MM/DD/YYYY';

Transactions:
    Load
        *,
        weekstart(date,-1) as previous_week_start,
        timestamp(weekstart(date,-1)) as previous_week_start_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/16/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

* previous\_week\_start

* previous\_week\_start\_timestamp

结果表

| 日期 | previous\_week\_start | previous\_week\_start\_timestamp |
| --- | --- | --- |
| 1/7/2022 | 12/26/2021 | 12/26/2021 12:00:00 AM |
| 1/19/2022 | 01/09/2022 | 1/9/2022 12:00:00 AM |
| 2/5/2022 | 01/23/2022 | 1/23/2022 12:00:00 AM |
| 2/28/2022 | 02/20/2022 | 2/20/2022 12:00:00 AM |
| 3/16/2022 | 03/06/2022 | 3/6/2022 12:00:00 AM |
| 4/1/2022 | 03/20/2022 | 3/20/2022 12:00:00 AM |
| 5/7/2022 | 04/24/2022 | 4/24/2022 12:00:00 AM |
| 5/16/2022 | 05/08/2022 | 5/8/2022 12:00:00 AM |
| 6/15/2022 | 06/05/2022 | 6/5/2022 12:00:00 AM |
| 6/26/2022 | 06/19/2022 | 6/19/2022 12:00:00 AM |
| 7/9/2022 | 06/26/2022 | 6/26/2022 12:00:00 AM |
| 7/22/2022 | 07/10/2022 | 7/10/2022 12:00:00 AM |
| 7/23/2022 | 07/10/2022 | 7/10/2022 12:00:00 AM |
| 7/27/2022 | 07/17/2022 | 7/17/2022 12:00:00 AM |
| 8/2/2022 | 07/24/2022 | 7/24/2022 12:00:00 AM |
| 8/8/2022 | 07/31/2022 | 7/31/2022 12:00:00 AM |
| 8/19/2022 | 08/07/2022 | 8/7/2022 12:00:00 AM |
| 9/26/2022 | 09/18/2022 | 9/18/2022 12:00:00 AM |
| 10/14/2022 | 10/02/2022 | 10/2/2022 12:00:00 AM |
| 10/29/2022 | 10/16/2022 | 10/16/2022 12:00:00 AM |

在本例中，由于 weekstart() 函数中使用了为 -1 的 period\_no 作为偏移参数，因此函数首先标识交易发生的周。然后，它查找前一周，并确定该周的第一毫秒。

weekstart() 函数的图表，period\_no 示例

weekstart() 函数的图表，period\_no 示例

weekstart()weekstart() 函数的图表，period\_no 示例![显示 weekstart 函数如何将交易日期转换为交易发生周第一一毫秒的时间戳的图。](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Resources/Images/scripting-functions-weekstart-examples-period-no.png)

交易 8196 发生在 6 月 15 日。weekstart() 函数确定周从 6 月 12 日开始。因此，前一周开始于 6 月 5 日中午 12:00:00；这是为 previous\_week\_start 字段返回的值。

## 示例 3 – first\_week\_day

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/DateAndTimeFunctions/weekstart.htm)

#### 加载脚本和结果

概述

打开数据加载编辑器，并将下面的加载脚本添加到新选项卡。

加载脚本包含与第一个示例相同的数据集和场景。但是，在本例中，我们需要将星期二设置为工作周的第一天。

加载脚本

```
SET DateFormat='MM/DD/YYYY';

Transactions:
    Load
        *,
        weekstart(date,0,1) as start_of_week,
        timestamp(weekstart(date,0,1)) as start_of_week_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/16/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

* start\_of\_week

* start\_of\_week\_timestamp

结果表

| 日期 | start\_of\_week | start\_of\_week\_timestamp |
| --- | --- | --- |
| 1/7/2022 | 01/04/2022 | 1/4/2022 12:00:00 AM |
| 1/19/2022 | 01/18/2022 | 1/18/2022 12:00:00 AM |
| 2/5/2022 | 02/01/2022 | 2/1/2022 12:00:00 AM |
| 2/28/2022 | 02/22/2022 | 2/22/2022 12:00:00 AM |
| 3/16/2022 | 03/15/2022 | 3/15/2022 12:00:00 AM |
| 4/1/2022 | 03/29/2022 | 3/29/2022 12:00:00 AM |
| 5/7/2022 | 05/03/2022 | 5/3/2022 12:00:00 AM |
| 5/16/2022 | 05/10/2022 | 5/10/2022 12:00:00 AM |
| 6/15/2022 | 06/14/2022 | 6/14/2022 12:00:00 AM |
| 6/26/2022 | 06/21/2022 | 6/21/2022 12:00:00 AM |
| 7/9/2022 | 07/05/2022 | 7/5/2022 12:00:00 AM |
| 7/22/2022 | 07/19/2022 | 7/19/2022 12:00:00 AM |
| 7/23/2022 | 07/19/2022 | 7/19/2022 12:00:00 AM |
| 7/27/2022 | 07/26/2022 | 7/26/2022 12:00:00 AM |
| 8/2/2022 | 08/02/2022 | 8/2/2022 12:00:00 AM |
| 8/8/2022 | 08/02/2022 | 8/2/2022 12:00:00 AM |
| 8/19/2022 | 08/16/2022 | 8/16/2022 12:00:00 AM |
| 9/26/2022 | 09/20/2022 | 9/20/2022 12:00:00 AM |
| 10/14/2022 | 10/11/2022 | 10/11/2022 12:00:00 AM |
| 10/29/2022 | 10/25/2022 | 10/25/2022 12:00:00 AM |

在本例中，因为 weekstart() 函数中使用了为 1 的 first\_week\_date 参数，所以它将一周的第一天设置为星期二。

weekstart() 函数的图表，first\_week\_day 示例

weekstart() 函数的图表，first\_week\_day 示例

weekstart()weekstart() 函数的图表，first\_week\_day 示例![显示 weekstart 函数如何将交易日期转换为交易发生周第一一毫秒的时间戳的图。](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Resources/Images/scripting-functions-weekstart-examples-first-week-day.png)

交易 8191 发生在 2 月 5 日。weekstart() 函数确定该日期之前的第一个星期二，即本周的开始时间和返回的值，是 2 月 1 日中午 12:00:00。

## 示例 4 – 图表对象

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/DateAndTimeFunctions/weekstart.htm)

#### 加载脚本和图表表达式

概述

打开数据加载编辑器，并将下面的加载脚本添加到新选项卡。

加载脚本包含与第一个示例相同的数据集和场景。

然而，在本例中，未更改的数据集被加载到应用程序中。返回交易发生时周初的时间戳的计算作为应用程序的图表对象中的度量创建。

加载脚本

```
Transactions:

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/16/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。

要计算交易发生的一周的开始时间，请添加以下度量：

* =weekstart(date)

* =timestamp(weekstart(date))

结果表

| 日期 | start\_of\_week | start\_of\_week\_timestamp |
| --- | --- | --- |
| 1/7/2022 | 01/02/2022 | 1/2/2022 12:00:00 AM |
| 1/19/2022 | 01/16/2022 | 1/16/2022 12:00:00 AM |
| 2/5/2022 | 01/30/2022 | 1/30/2022 12:00:00 AM |
| 2/28/2022 | 02/27/2022 | 2/27/2022 12:00:00 AM |
| 3/16/2022 | 03/13/2022 | 3/13/2022 12:00:00 AM |
| 4/1/2022 | 03/27/2022 | 3/27/2022 12:00:00 AM |
| 5/7/2022 | 05/01/2022 | 5/1/2022 12:00:00 AM |
| 5/16/2022 | 05/15/2022 | 5/15/2022 12:00:00 AM |
| 6/15/2022 | 06/12/2022 | 6/12/2022 12:00:00 AM |
| 6/26/2022 | 06/26/2022 | 6/26/2022 12:00:00 AM |
| 7/9/2022 | 07/03/2022 | 7/3/2022 12:00:00 AM |
| 7/22/2022 | 07/17/2022 | 7/17/2022 12:00:00 AM |
| 7/23/2022 | 07/17/2022 | 7/17/2022 12:00:00 AM |
| 7/27/2022 | 07/24/2022 | 7/24/2022 12:00:00 AM |
| 8/2/2022 | 07/31/2022 | 7/31/2022 12:00:00 AM |
| 8/8/2022 | 08/07/2022 | 8/7/2022 12:00:00 AM |
| 8/19/2022 | 08/14/2022 | 8/14/2022 12:00:00 AM |
| 9/26/2022 | 09/25/2022 | 9/25/2022 12:00:00 AM |
| 10/14/2022 | 10/09/2022 | 10/9/2022 12:00:00 AM |
| 10/29/2022 | 10/23/2022 | 10/23/2022 12:00:00 AM |

通过使用 weekstart() 函数并将 date 字段作为函数的参数传递，在图表对象中创建 start\_of\_week 度量。

weekstart() 函数初始标识日期值属于哪个周，并返回该周第一毫秒的时间戳。

weekstart() 函数的图表，图表对象示例

weekstart() 函数的图表，图表对象示例

weekstart()weekstart() 函数的图表，图表对象示例![显示 weekstart 函数如何将交易日期转换为交易发生周第一一毫秒的时间戳的图。](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Resources/Images/scripting-functions-weekstart-examples-chart-object.png)

交易 8191 发生在 2 月 5 日。FirstWeekDay 系统变量将一周的第一天设置为星期日。weekstart() 函数确定 2 月 5 日之前的第一个星期日（因此是本周的开始）是 1 月 30 日。因此，该交易的 start\_of\_week 值返回当天的第一毫秒，即 1 月 30 日上午 12:00:00。

## 示例 5 – 场景

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/DateAndTimeFunctions/weekstart.htm)

#### 加载脚本和图表表达式

概述

打开数据加载编辑器，并将下面的加载脚本添加到新选项卡。

加载脚本包含：

* 加载到名为 Payroll 的表中的数据集。

* 由员工 ID、员工姓名和每位员工的每日工资组成的数据。

员工周一开始上班，每周工作六天。不得修改 FirstWeekDay 系统变量。

最终用户需要一个图表对象，该对象按员工 ID 和员工姓名显示本周迄今为止的工资。

加载脚本

```
Payroll: 
Load
*
Inline 
[
employee_id,employee_name,day_rate
182,Mark, $150
183,Deryck, $125
184,Dexter, $125
185,Sydney,$270
186,Agatha,$128
];
```

结果

执行以下操作：

1. 加载数据并打开工作表。创建新表并将这些字段添加为维度：

   * employee\_id

   * employee\_name

2. 接下来，创建一个度量来计算本周迄今为止的工资：

   =if(today(1)-weekstart(today(1),0,0)&lt;7,(today(1)-weekstart(today(1),0,0))\*day\_rate,day\_rate\*6)

3. 将度量的数字格式设置为金额。

结果表

| EmployeeID | employee\_name | =if(today(1)-weekstart(today(1),0,0)&lt;7,(today(1)-weekstart(today(1),0,0))\*day\_rate,day\_rate\*6) |
| --- | --- | --- |
| 182 | Mark | $600.00 |
| 183 | Deryck | $500.00 |
| 184 | Dexter | $500.00 |
| 185 | Sydney | $1080.00 |
| 186 | Agatha | $512.00 |

weekstart() 函数使用今天的日期作为第一个参数，使用 0 作为第三个参数，将星期一设置为一周的第一天，并返回当前一周的开始日期。通过从当前日期中减去该结果，表达式将返回本周迄今为止经过的天数。

然后，条件评估本周是否有超过六天的时间。如果是这样，则员工的 day\_rate 乘以 6 天。否则，将 day\_rate 乘以本周迄今为止发生的天数。