# 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:00。<br><br>換言之，若要建立偏移，請依 24 小時分割開始時間。例如，對於在上午 7:00 開始的日子，請使用分數 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`) 的前置載入。

除了日期，不會向函數提供其他參數。

載入指令碼

```
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()` 函數並提供所有三個參數的前置載入：`time`、`period_no` 和 `day_start`。此前置載入建立下列兩個新的日期欄位：

  * `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)

#### 載入指令碼和結果

概述

開啟資料載入編輯器並將下面的載入指令碼新增至新的區段。

載入指令碼包含：

* 與上一個範例相同的資料集和情境。

* 與上一個範例相同的前置載入。

在此範例中，我們將工作日設定為在每天上午 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:00 。

因為 `due_date` 欄位沒有時間戳記，這會被視為上午 12:00，因此仍然屬於前一天，因為每天在上午 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 的時間戳記，因為傳遞至 daystart() 函數 day\_start 的第三引數值為 7/24。