# makeweekdate - 指令碼與圖表函數

此函數會傳回從年、週數及星期幾計算而得的日期。

語法：

MakeWeekDate(weekyear [, week [, weekday [, first\_week\_day [, broken\_weeks [, reference\_day]]]]])

傳回的資料類型： 雙值

`makeweekdate()` 函數可作為指令碼和圖表函數。該函數將根據傳遞至函數中的參數計算日期。

引數

| 引數 | 描述 |
| --- | --- |
| weekyear | `WeekYear()` 函數為特定日期定義的年份，亦即該週數屬於的年份。<br><br>資訊備註在某些情況下，該週年份可以與日曆年份不同，例如，若第 1 週已在上一年的 12 月開始。 |
| week | `Week()` 函數為特定日期定義的週數。<br><br>如未指定週數，則會採用 1。 |
| weekday | `WeekDay()` 函數為問題中的日期定義的星期幾。0 是一週的第一天，而 6 是一週的最後一天。<br><br>如未指定星期幾，則會採用 0。<br><br>資訊備註即使 0 一律代表一週的第一天，而 6 一律是最後一天，對應至星期幾仍然由 first\_week\_day 參數決定。如果忽略，將使用變數 FirstWeekDay 的值。<br><br>若使用中斷的週，以及不可能的參數組合，這可能會導致不屬於所選年份的結果。<br><br>範例：<br><br>```<br>MakeWeekDate(2021,1,0,6,1)<br>```<br><br>傳回「Dec 27 2020」，因為此日是指定週的第一天 (星期日)。2021 年 1 月 1 日是星期五。 |
| first\_week\_day | 指定一週開始的日期。如果忽略，將使用變數 FirstWeekDay 的值。<br><br>first\_week\_day 可能的值是對星期一使用 0、對星期二使用 1，對星期三使用 2，對星期四使用 3，對星期五使用 4，對星期六使用 5，並對星期日使用 6。<br><br>如需系統變數的更多資訊，請參閱 [FirstWeekDay](https://help.qlik.com/zh-TW/sense/November2024/Subsystems/Hub/Content/Sense_Hub/Scripting/NumberInterpretationVariables/FirstWeekDay.htm)。 |
| broken\_weeks | 如果您未指定 broken\_weeks，則變數 BrokenWeeks 的值會用於定義週是否中斷。<br><br>如需系統變數的更多資訊，請參閱 [BrokenWeeks](https://help.qlik.com/zh-TW/sense/November2024/Subsystems/Hub/Content/Sense_Hub/Scripting/NumberInterpretationVariables/BrokenWeeks.htm) |
| reference\_day | 如果您不指定 reference\_day，變數 ReferenceDay 的值會用於定義要設定一月份的哪一天為參照日以定義第 1 週。<br><br>如需系統變數的更多資訊，請參閱 [ReferenceDay](https://help.qlik.com/zh-TW/sense/November2024/Subsystems/Hub/Content/Sense_Hub/Scripting/NumberInterpretationVariables/ReferenceDay.htm) |

## 什麼情況下使用

`makeweekdate()` 函數通常用於進行資料產生的指令碼中，以產生日期清單，或用來在輸入資料中提供年份、週和星期幾時建構日期。

下列範例假設：

```
SET FirstWeekDay=0;
SET BrokenWeeks=0;
SET ReferenceDay=4;
```

函數範例

| 範例 | 結果 |
| --- | --- |
| `makeweekdate(2014,6,6)` | 傳回 02/09/2014 |
| `makeweekdate(2014,6,1)` | 傳回 02/04/2014 |
| `makeweekdate(2014,6)` | 傳回 02/03/2014 (採用工作日 0) |

## 區域設定

除非另有說明，否則此主題中的範例皆使用下列日期格式：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/makeweekdate.htm)

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

概覽

開啟資料載入編輯器並將下面的載入指令碼新增至新的索引標籤。

載入指令碼包含：

* 稱為 `Sales` 的表格中包含 2022 年每週銷售總額的資料集。

* 跨越三個欄位提供的交易日期：`year`、`week` 和 `sales`。

* 用來建立量值 `end_of_week` 的前置載入，使用 `makeweekdate()` 函數以格式 MM/DD/YYYY 傳回該週星期五的日期。

若要證明傳回的日期是星期五，`end_of_week` 運算式也包覆在 `weekday()` 函數中，以顯示星期幾。

載入指令碼

```
SET DateFormat='MM/DD/YYYY';
SET FirstWeekDay=0;
SET BrokenWeeks=0;
SET ReferenceDay=4;

Transactions:
    Load
        *,
        makeweekdate(transaction_year, transaction_week,4) as end_of_week,
        weekday(makeweekdate(transaction_year, transaction_week,4)) as week_day
        ; 
Load * Inline [
transaction_year, transaction_week, sales
2022, 01, 10000
2022, 02, 11250
2022, 03, 9830
2022, 04, 14010
2022, 05, 28402
2022, 06, 9992
2022, 07, 7292
];
```

結果

載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度：

* `transaction_year`

* `transaction_week`

* `end_of_week`

* `week_day`

結果表格

| transaction\_year | transaction\_week | end\_of\_week | week\_day |
| --- | --- | --- | --- |
| 2022 | 01 | 01/07/2022 | 星期五 |
| 2022 | 02 | 01/14/2022 | 星期五 |
| 2022 | 03 | 01/21/2022 | 星期五 |
| 2022 | 04 | 01/28/2022 | 星期五 |
| 2022 | 05 | 02/04/2022 | 星期五 |
| 2022 | 06 | 02/11/2022 | 星期五 |
| 2022 | 07 | 02/18/2022 | 星期五 |

「`end_of_week`」欄位使用 `makeweekdate()` 函數在前置 LOAD 陳述式中建立。透過該函數傳遞 `transaction_week` 欄位 `transaction_year` 作為年和週引數。值 4 用於日子引數。

然後該函數會將這些值合併並轉換為日期欄位，以 `DateFormat` 系統變數格式傳回結果。

`makeweekdate()` 函數及其引數也包覆在 `weekday()` 函數中，以傳回 `week_day` 欄位；如上表所見，`week_day` 欄位顯示這些日期的確發生在星期五。

## 範例 2 – 排除日子

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

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

概覽

開啟資料載入編輯器並將下面的載入指令碼新增至新的索引標籤。

載入指令碼包含：

* 稱為 Sales 的表格中包含 2022 年每週銷售總額的資料集。

* 跨越三個欄位提供的交易日期：year、week 和 sales。

* 使用 makeweekdate() 函數建立量值 first\_day\_of\_week 的前置載入。這將會以格式 MM/DD/YYYY 傳回該週星期一的日期。

若要證明傳回的日期是星期一，first\_day\_of\_week 運算式也包覆在 weekday() 函數中，以顯示星期幾。

載入指令碼

```
SET DateFormat='MM/DD/YYYY';
SET FirstWeekDay=0;
SET BrokenWeeks=0;
SET ReferenceDay=4;

Transactions:
    Load
        *,
        makeweekdate(transaction_year, transaction_week) as first_day_of_week,
        weekday(makeweekdate(transaction_year, transaction_week)) as week_day
        ; 
Load * Inline [
transaction_year, transaction_week, sales
2022, 01, 10000
2022, 02, 11250
2022, 03, 9830
2022, 04, 14010
2022, 05, 28402
2022, 06, 9992
2022, 07, 7292
];
```

結果

載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度：

* transaction\_year

* transaction\_week

* first\_day\_of\_week

* week\_day

結果表格

| transaction\_year | transaction\_week | first\_day\_of\_week | week\_day |
| --- | --- | --- | --- |
| 2022 | 01 | 01/03/2022 | 星期一 |
| 2022 | 02 | 01/10/2022 | 星期一 |
| 2022 | 03 | 01/17/2022 | 星期一 |
| 2022 | 04 | 01/24/2022 | 星期一 |
| 2022 | 05 | 01/31/2022 | 星期一 |
| 2022 | 06 | 02/07/2022 | 星期一 |
| 2022 | 07 | 02/14/2022 | 星期一 |

first\_day\_of\_week 欄位使用 makeweekdate() 函數在前置 LOAD 陳述式中建立。transaction\_year 和 transaction\_week 參數作為函數引數傳遞，而日子參數則留下空白。

然後該函數會將這些值合併並轉換為日期欄位，以 DateFormat 系統變數格式傳回結果。

makeweekdate() 函數及其引數也會包覆在 weekday() 函數中，以傳回 week\_day 欄位。如上表所見，week\_day 欄位在所有情況下都傳回星期一，因為該參數在 makeweekdate() 函數中為空白，預設為 0 (一週的第一天)，而一週的第一天由 FirstWeekDay 系統變數設為星期一。

## 範例 3 – 圖表物件範例

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

#### 載入指令碼和圖表運算式

概覽

開啟資料載入編輯器並將下面的載入指令碼新增至新的索引標籤。

載入指令碼包含：

* 稱為 Sales 的表格中包含 2022 年每週銷售總額的資料集。

* 跨越三個欄位提供的交易日期：year、week 和 sales。

在此範例中，圖表物件將用來建立等同於第一個範例中 end\_of\_week 計算的量值。此量值將會使用 makeweekdate() 函數以格式 MM/DD/YYYY 傳回該週星期五的日期。

若要證明傳回的日期是星期五，建立第二個量值，以傳回星期幾。

載入指令碼

```
SET DateFormat='MM/DD/YYYY';
SET FirstWeekDay=0;
SET BrokenWeeks=0;
SET ReferenceDay=4;

Master_Calendar:
Load * Inline [
transaction_year, transaction_week, sales
2022, 01, 10000
2022, 02, 11250
2022, 03, 9830
2022, 04, 14010
2022, 05, 28402
2022, 06, 9992
2022, 07, 7292
];
```

結果

請執行下列動作：

1. 載入資料並開啟工作表。建立新的表格並將這些欄位新增為維度：

   * transaction\_year

   * transaction\_week

2. 若要執行等同於第一個範例中 end\_of\_week 欄位的計算，建立下列量值：

   =makeweekdate(transaction\_year,transaction\_week,4)

3. 若要計算每個交易是星期幾，建立下列量值：

   =weekday(makeweekdate(transaction\_year,transaction\_week,4))

結果表格

| transaction\_year | transaction\_week | =makeweekdate(transaction\_year,transaction\_week,4) | =weekday(makeweekdate(transaction\_year,transaction\_week,4)) |
| --- | --- | --- | --- |
| 2022 | 01 | 01/07/2022 | 星期五 |
| 2022 | 02 | 01/14/2022 | 星期五 |
| 2022 | 03 | 01/21/2022 | 星期五 |
| 2022 | 04 | 01/28/2022 | 星期五 |
| 2022 | 05 | 02/04/2022 | 星期五 |
| 2022 | 06 | 02/11/2022 | 星期五 |
| 2022 | 07 | 02/18/2022 | 星期五 |

會使用 makeweekdate() 函數在圖表物件中建立等同於 end\_of\_week 的欄位作為量值。傳遞 transaction\_year 和 transaction\_week 欄位作為年和週引數。值 4 用於日子引數。

然後該函數會將這些值合併並轉換為日期欄位，以 DateFormat 系統變數格式傳回結果。

makeweekdate() 函數及其引數也會包覆在 weekday() 函數中，以傳回等同於第一個範例中 week\_day 欄位的計算。如上表所見，右側最後一欄顯示這些日期的確發生在星期五。

## 範例 4 – 情境

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

#### 載入指令碼和圖表運算式

概覽

在此範例中，建立包含 2022 年所有星期五的日期清單。

開啟資料載入編輯器並將下面的載入指令碼新增至新的索引標籤。

載入指令碼

```
SET DateFormat='MM/DD/YYYY';
SET FirstWeekDay=0;
SET BrokenWeeks=0;
SET ReferenceDay=4;

Calendar:
    load
	    *,
        weekday(date) as weekday
    where year(date)=2022;
load
    makeweekdate(2022,recno()-2,4) as date
AutoGenerate 60;
```

結果

結果表格

| 日期 | weekday |
| --- | --- |
| 01/07/2022 | 星期五 |
| 01/14/2022 | 星期五 |
| 01/21/2022 | 星期五 |
| 01/28/2022 | 星期五 |
| 02/04/2022 | 星期五 |
| 02/11/2022 | 星期五 |
| 02/18/2022 | 星期五 |
| 02/25/2022 | 星期五 |
| 03/04/2022 | 星期五 |
| 03/11/2022 | 星期五 |
| 03/18/2022 | 星期五 |
| 03/25/2022 | 星期五 |
| 04/01/2022 | 星期五 |
| 04/08/2022 | 星期五 |
| 04/15/2022 | 星期五 |
| 04/22/2022 | 星期五 |
| 04/29/2022 | 星期五 |
| 05/06/2022 | 星期五 |
| 05/13/2022 | 星期五 |
| 05/20/2022 | 星期五 |
| 05/27/2022 | 星期五 |
| 06/03/2022 | 星期五 |
| 06/10/2022 | 星期五 |
| 06/17/2022 | 星期五 |
| 還有 + 27 列 |  |

makeweekdate() 函數尋找 2022 年的每個星期五。使用週參數 -2 確保不會遺漏任何日期。最後，前置載入建立附加 weekday 欄位，以便清楚顯示每個 date 值是星期五。