# daystart 脚本和图表功能

此函数用于返回与 time 参数中包含的一天的最后毫秒时间戳对应的值。默认的输出格式为在脚本中所设置的 TimestampFormat。

语法：

DayStart(time[, [period\_no[, day\_start]])

返回数据类型： 双

参数

| 参数 | 描述 |
| --- | --- |
| time | 要求值的时间戳。 |
| period\_no | period\_no 为整数，或解算为整数的表达式，其中值 0 表示该天包含 time。period\_no 为负数表示前几天，正数表示随后的几天。 |
| day\_start | 要指定不想从某一日的午夜开始工作，可在 day\_start 中指定一个偏移作为某日内时间的小数。例如，0.125 表示上午 3 点。<br><br>换句话说，要创建偏移，请将开始时间除以 24 小时。例如，对于 7:00 AM 开始的一天，使用分数 7/24。 |

## 适合使用它的情况

当用户希望计算使用到目前为止已过的一天的部分时，`daystart()` 函数通常用作表达式的一部分。例如，它可以用于计算员工迄今为止挣得的总工资。

以下示例使用时间戳格式 `'M/D/YYYY h:mm:ss[.fff] TT'`。时间戳格式已经在数据加载脚本顶部的 `SET TimeStamp` 语句中指定。可以根据要求更改示例中的格式。

函数示例

| 示例 | 结果 |
| --- | --- |
| `daystart('01/25/2013 4:45:00 PM')` | 返回 1/25/2013 12:00:00 AM。 |
| `daystart('1/25/2013 4:45:00 PM', -1)` | 返回 1/24/2013 12:00:00 AM。 |
| `daystart('1/25/2013 16:45:00',0,0.5<br>)` | 返回 1/25/2013 12:00:00 PM。 |

## 区域设置

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

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

## 示例 1 – 简单示例

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

#### 加载脚本和结果

概述

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

加载脚本包含：

* 包含日期列表的简单数据集，该数据集加载到名为 `Calendar` 的表中。

* 使用默认 `TimeStampFormat` 系统变量 `(M/D/YYYY h:mm:ss[.fff] TT`。

* 使用 `daystart()` 功能创建另一个名为 `SOD_timestamp` 的字段的前置 Load。

除了日期之外，没有为函数提供其他参数。

加载脚本

```
SET TimestampFormat='M/D/YYYY h:mm:ss[.fff] TT';

Calendar:
    Load
        date,
        daystart(date) as SOD_timestamp
        ;
Load
date
Inline 
[
date
03/11/2022 1:47:15 AM
03/12/2022 4:34:58 AM
03/13/2022 5:15:55 AM
03/14/2022 9:25:14 AM
03/15/2022 10:06:54 AM
03/16/2022 10:44:42 AM
03/17/2022 11:33:30 AM
03/18/2022 12:58:14 PM
03/19/2022 4:23:12 PM
03/20/2022 6:42:15 PM
03/21/2022 7:41:16 PM
];
					
```

结果

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

* `date`

* `SOD_timestamp`

结果表

| 日期 | SOD\_timestamp |
| --- | --- |
| 03/11/2022 1:47:15 AM | 3/11/2022 12:00:00 AM |
| 03/12/2022 4:34:58 AM | 3/12/2022 12:00:00 AM |
| 03/13/2022 5:15:55 AM | 3/13/2022 12:00:00 AM |
| 03/14/2022 9:25:14 AM | 3/14/2022 12:00:00 AM |
| 03/15/2022 10:06:54 AM | 3/15/2022 12:00:00 AM |
| 03/16/2022 10:44:42 AM | 3/16/2022 12:00:00 AM |
| 03/17/2022 11:33:30 AM | 3/17/2022 12:00:00 AM |
| 03/18/2022 12:58:14 PM | 3/18/2022 12:00:00 AM |
| 03/19/2022 4:23:12 PM | 3/19/2022 12:00:00 AM |
| 03/20/2022 6:42:15 PM | 3/20/2022 12:00:00 AM |
| 03/21/2022 7:41:16 PM | 3/21/2022 12:00:00 AM |

如上表所示，为数据集中的每个日期生成了一天结束时间戳。时间戳采用系统变量 `TimestampFormat M/D/YYYY h:mm:ss[.fff] TT` 的格式。

## 示例 2 – period\_no

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

#### 加载脚本和结果

概述

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

加载脚本包含：

* 包含停车罚款的数据集，将其加载到名为 `Fines` 的表中。数据集包括以下字段：

  * `id`

  * `due_date`

  * `number_plate`

  * `amount`

* 使用 `daystart()` 函数并提供所有以下三个参数的前置 Load： `time`、`period_no` 和 `day_start`。前置 Load 创建了以下两个新的日期字段：

  * `early_repayment_period` 日期字段，从付款到期前七天开始。

  * `late_penalty_period` 日期字段，从付款到期后 14 天开始。

加载脚本

```
SET TimestampFormat='M/D/YYYY h:mm:ss[.fff] TT';

Fines:
    Load
        *,
        daystart(due_date,-7) as early_repayment_period,
        daystart(due_date,14) as late_penalty_period
        ;
Load
*
Inline
[
id, due_date, number_plate,amount
1,02/11/2022, 573RJG,50.00
2,03/25/2022, SC41854,50.00
3,04/14/2022, 8EHZ378,50.00
4,06/28/2022, 8HSS198,50.00
5,08/15/2022, 1221665,50.00
6,11/16/2022, EAK473,50.00
7,01/17/2023, KD6822,50.00
8,03/22/2023, 1GGLB,50.00
];
```

结果

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

* `due_date`

* `early_repayment_period`

* `late_penalty_period`

结果表

| due\_date | early\_repayment\_period | late\_penalty\_period |
| --- | --- | --- |
| 02/11/2022 9:25:14 AM | 2/4/2022 12:00:00 AM | 2/25/2022 12:00:00 AM |
| 03/25/2022 10:06:54 AM | 3/18/2022 12:00:00 AM | 4/8/2022 12:00:00 AM |
| 04/14/2022 10:44:42 AM | 4/7/2022 12:00:00 AM | 4/28/2022 12:00:00 AM |
| 06/28/2022 11:33:30 AM | 6/21/2022 12:00:00 AM | 7/12/2022 12:00:00 AM |
| 08/15/2022 12:58:14 PM | 8/8/2022 12:00:00 AM | 8/29/2022 12:00:00 AM |
| 11/16/2022 4:23:12 PM | 11/9/2022 12:00:00 AM | 11/30/2022 12:00:00 AM |
| 01/17/2023 6:42:15 PM | 1/10/2023 12:00:00 AM | 1/31/2023 12:00:00 AM |
| 03/22/2023 7:41:16 PM | 3/15/2023 12:00:00 AM | 4/5/2023 12:00:00 AM |

新字段的值位于 `TimestampFormat M/DD/YYYY tt` 中。因为使用了函数 `daystart()`，所以时间戳值都是一天中的第一毫秒。

由于 `  daystart() ` 函数中传递的第二个参数为负数，因此提前还款期值为到期日前七天。

由于 `daystart()` 函数中传递的第二个参数为正，逾期还款期值为到期日后 14 天。

## 示例 3 – day\_start

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

#### 加载脚本和结果

概述

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

加载脚本包含：

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

* 与前一示例相同的前置 Load。

在本例中，我们将工作日设置为每天早上 7:00 开始和结束。

加载脚本

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

Fines:
    Load
        *,
        daystart(due_date,-7,7/24) as early_repayment_period,	 
        daystart(due_date,14, 7/24) as late_penalty_period
        ;
Load
*
Inline
[
id, due_date, number_plate,amount
1,02/11/2022, 573RJG,50.00
2,03/25/2022, SC41854,50.00
3,04/14/2022, 8EHZ378,50.00
4,06/28/2022, 8HSS198,50.00
5,08/15/2022, 1221665,50.00
6,11/16/2022, EAK473,50.00
7,01/17/2023, KD6822,50.00
8,03/22/2023, 1GGLB,50.00
];
```

结果

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

* `due_date`

* `early_repayment_period`

* `late_penalty_period`

结果表

| due\_date | early\_repayment\_period | late\_penalty\_period |
| --- | --- | --- |
| 02/11/2022 | 2/3/2022 7:00:00 AM | 2/24/2022 7:00:00 AM |
| 03/25/2022 | 3/17/2022 7:00:00 AM | 4/7/2022 7:00:00 AM |
| 04/14/2022 | 4/6/2022 7:00:00 AM | 4/27/2022 7:00:00 AM |
| 06/28/2022 | 6/20/2022 7:00:00 AM | 7/11/2022 7:00:00 AM |
| 08/15/2022 | 8/7/2022 7:00:00 AM | 8/28/2022 7:00:00 AM |
| 11/16/2022 | 11/8/2022 7:00:00 AM | 11/29/2022 7:00:00 AM |
| 01/17/2023 | 1/9/2023 7:00:00 AM | 1/30/2023 7:00:00 AM |
| 03/22/2023 | 3/14/2023 7:00:00 AM | 4/4/2023 7:00:00 AM |

现在日期的时间戳为上午 7:00，因为传递给 `daystart()` 函数的 `day_start` 参数值为 7/24。这将一天的开始时间设置为早上 7 点。

因为 `due_date` 字段没有时间戳，所以它被视为 12:00 AM，这仍然是前一天的一部分，因为这些天的开始和结束时间都是早上 7:00。因此，2 月 11 日到期的罚款的提前还款期从 2 月 3 日早上 7:00 开始。

## 示例 4 – 图表对象示例

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

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

概述

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

该示例使用与上一个示例相同的数据集和场景。

但是，只有原始 Fines 表加载到应用程序中，在图表对象中计算两个额外的截止日期值。

加载脚本

```
SET TimestampFormat='M/D/YYYY h:mm:ss[.fff] TT';

Fines:
    Load
*
Inline 
[
id, due_date, numer_plate,amount
1,02/11/2022 9:25:14 AM, 573RJG,50.00
2,03/25/2022 10:06:54 AM, SC41854,50.00
3,04/14/2022 10:44:42 AM, 8EHZ378,50.00
4,06/28/2022 11:33:30 AM, 8HSS198,50.00
5,08/15/2022 12:58:14 PM, 1221665,50.00
6,11/16/2022 4:23:12 PM, EAK473,50.00
7,01/17/2023 6:42:15 PM, KD6822,50.00
8,03/22/2023 7:41:16 PM, 1GGLB,50.00
];
```

结果

执行以下操作：

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

2. 要创建 early\_repayment\_period 字段，请创建以下度量。

   =daystart(due\_date,-7,7/24)

3. 要创建 late\_penalty\_period 字段，请创建以下度量：

   =daystart(due\_date,14,7/24)

结果表

| due\_date | =daystart(due\_date,-7,7/24) | =daystart(due\_date,14,7/24) |
| --- | --- | --- |
| 02/11/2022 9:25:14 AM | 2/4/2022 7:00:00 AM | 2/25/2022 7:00:00 AM |
| 03/25/2022 10:06:54 AM | 3/18/2022 7:00:00 AM | 4/8/2022 7:00:00 AM |
| 04/14/2022 10:44:42 AM | 4/7/2022 7:00:00 AM | 4/28/2022 7:00:00 AM |
| 06/28/2022 11:33:30 AM | 6/21/2022 7:00:00 AM | 7/12/2022 7:00:00 AM |
| 08/15/2022 12:58:14 PM | 8/8/2022 7:00:00 AM | 8/29/2022 7:00:00 AM |
| 11/16/2022 4:23:12 PM | 11/9/2022 7:00:00 AM | 11/30/2022 7:00:00 AM |
| 01/17/2023 6:42:15 PM | 1/10/2023 7:00:00 AM | 1/31/2023 7:00:00 AM |
| 03/22/2023 7:41:16 PM | 3/15/2023 7:00:00 AM | 4/5/2023 7:00:00 AM |

新字段的值位于 TimestampFormat M/D/YYYY h:mm:ss[.fff] TT 中。因为使用了函数 daystart()，所以时间戳值对应于一天中的第一毫秒。

由于 daystart() 函数中传递的第二个参数为负数，因此提前还款期值为到期日前七天。

由于 daystart() 函数中传递的第二个参数为正，逾期还款期值为到期日后 14 天。

日期的时间戳为上午 7:00，因为传递给 day\_start 函数的 daystart() 第三参数值为 7/24。