# 衍生字段

如果您拥有一组关联的字段，或者如果字段包含在创建维度或度量时可以将其细分成更小部分的信息，则您可以创建用于生成导出字段的字段定义。其中一个示例为您可以从中导出多个属性的日期字段，如年、月、周数或天数。所有这些属性都可以使用 Qlik Sense 日期函数在维度表达式中进行计算，但另一种方法是创建可共同用于所有日期类型字段的日历定义。字段定义存储在数据加载脚本中。

信息注释Qlik Sense 的默认日历字段定义包括在使用数据管理器加载的日期字段的 autoCalendar 中。有关更多信息，请参阅[使用自动日历自动派生日期字段](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Sense_Hub/Scripting/derived-fields.htm#Automati)和[将数据添加至应用程序](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Sense_Hub/LoadData/adding-data.htm)。

## 声明日历字段定义

您可以使用 Declare 语句创建导出字段的定义。可以在此处定义字段的不同属性，在此例中为日期相关属性。每个字段均可描述为 `<expression> As field_name tagged tag`。设置一个或多个标记是可选的，但此设置会影响导出字段的排序顺序。使用 `$1` 来引用应根据导出的字段生成的数据字段。

警告注释 除非您正在创建自己的自动日历或使用由 数据管理器 创建的自动配置 `[autoCalendar]`，否则不要用 autoCalendar 作为日历字段定义的名称。此名称是为自动生成的日历模板保留的。请参阅[使用自动日历自动派生日期字段](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Sense_Hub/Scripting/derived-fields.htm#Automati)。

```
Calendar:
DECLARE FIELD DEFINITION TAGGED '$date'
   Parameters
      first_month_of_year = 1
   Fields
      Year($1) As Year Tagged ('$numeric'),
      Month($1) as Month Tagged ('$numeric'),
      Date($1) as Date Tagged ('$date'),
      Week($1) as Week Tagged ('$numeric'),
      Weekday($1) as Weekday Tagged ('$numeric'),
      DayNumberOfYear($1, first_month_of_year) as DayNumberOfYear Tagged ('$numeric');
```

有关详细信息，请参阅[Declare](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Declare.htm)。

## 使用 Derive 将数据字段映射到日历

下一步是使用 Derive 语句将现有数据字段映射到日历。这将会创建导出的字段。在数据加载脚本中可使用三种可选方式执行此操作：

* 按字段名称映射特定字段。

  ```
  DERIVE FIELDS FROM FIELDS OrderDate,ShippingDate USING Calendar;
  ```

* 使用一个或多个特定字段标记映射所有字段。

  ```
  DERIVE FIELDS FROM EXPLICIT TAGS ('$date') USING Calendar;
  ```

* 使用其中一个字段定义标记映射标记的所有字段（在上例中为 $date）。

  ```
  DERIVE FIELDS FROM IMPLICIT TAG USING Calendar;
  ```

在这种情况下，可以使用此处的三个示例中的任何示例。

有关详细信息，请参阅[Derive](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Derive.htm)。

## 使用自动日历自动派生日期字段

如果您使用 数据管理器 来构建应用程序和加载数据，则名为 [autoCalendar] 的日历会自动插入到加载脚本中，以提供默认日历定义。这些在应用程序的业务逻辑中是可见的。

对于使用脚本创建的包含日期字段的应用程序，您可以在加载所有适用的日期字段后，将如下所示的 [autoCalendar] 代码插入脚本的某个部分。这允许应用程序用户使用所有可用的基于期间的分析类型，包括那些可以构建智能表的分析类型。请注意，日历必须具有标题 [autocalendar]，才能在业务逻辑中正确添加日历期间。

修改行 DERIVE FIELDS FROM FIELDS [My\_Date\_Field1], [My\_Date\_Field2] USING [autoCalendar] ; 中的 [My\_Date\_Field1] 和 [My\_Date\_Field2] 字段名称，以将日期字段与自动日历计算链接，从而生成新的衍生日期字段。如果只有一个日期字段可链接到自动日历，请删除[My\_Date\_Field2]。同样，如果有两个以上的日期字段要为其启用自动日历，请添加其他日期字段。

```
[autoCalendar]:
  DECLARE FIELD DEFINITION Tagged ('$date')
FIELDS		
  Dual(Year($1), YearStart($1)) AS [Year] Tagged ('$axis', '$year'),
  Dual('Q'&Num(Ceil(Num(Month($1))/3)),Num(Ceil(NUM(Month($1))/3),00)) AS [Quarter] Tagged ('$quarter', '$cyclic'),
  Dual(Year($1)&'-Q'&Num(Ceil(Num(Month($1))/3)),QuarterStart($1)) AS [YearQuarter] Tagged ('$yearquarter', '$qualified'),
  Dual('Q'&Num(Ceil(Num(Month($1))/3)),QuarterStart($1)) AS [_YearQuarter] Tagged ('$yearquarter', '$hidden', '$simplified'),
  Month($1) AS [Month] Tagged ('$month', '$cyclic'),
  Dual(Year($1)&'-'&Month($1), monthstart($1)) AS [YearMonth] Tagged ('$axis', '$yearmonth', '$qualified'),
  Dual(Month($1), monthstart($1)) AS [_YearMonth] Tagged ('$axis', '$yearmonth', '$simplified', '$hidden'),
  Dual('W'&Num(Week($1),00), Num(Week($1),00)) AS [Week] Tagged ('$weeknumber', '$cyclic'),
  Date(Floor($1)) AS [Date] Tagged ('$axis', '$date', '$qualified'),
  Date(Floor($1), 'D') AS [_Date] Tagged ('$axis', '$date', '$hidden', '$simplified'),
  If (DayNumberOfYear($1) <= DayNumberOfYear(Today()), 1, 0) AS [InYTD] ,
  Year(Today())-Year($1) AS [YearsAgo] ,
  If (DayNumberOfQuarter($1) <= DayNumberOfQuarter(Today()),1,0) AS [InQTD] ,
  4*Year(Today())+Ceil(Month(Today())/3)-4*Year($1)-Ceil(Month($1)/3) AS [QuartersAgo] ,
  Ceil(Month(Today())/3)-Ceil(Month($1)/3) AS [QuarterRelNo] ,
  If(Day($1)<=Day(Today()),1,0) AS [InMTD] ,
  12*Year(Today())+Month(Today())-12*Year($1)-Month($1) AS [MonthsAgo] ,
  Month(Today())-Month($1) AS [MonthRelNo] ,
  If(WeekDay($1)<=WeekDay(Today()),1,0) AS [InWTD] ,
  (WeekStart(Today())-WeekStart($1))/7 AS [WeeksAgo] ,	
  Week(Today())-Week($1) AS [WeekRelNo] ;

DERIVE FIELDS FROM FIELDS [My_Date_Field1], [My_Date_Field2] USING [autoCalendar] ;
```

如果操作正确，将在应用程序的业务逻辑中自动创建多个日历期间，您将能够在 Insight Advisor 中使用基于期间的分析类型。

有关详细信息，请参阅[在 Insight Advisor 中使用智能表进行基于期间的分析](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Sense_Hub/Insights/insight-advisor-smart-sheets.htm)。

## 在可视化中使用导出的日期字段

如果您已创建日历定义并按照此处示例所示映射字段，Qlik Sense 将准备识别导出的日期字段。在字段资产面板的日期和时间字段部分中也提供了这些字段。在创建或编辑维度时，您也可以在表达式编辑器中找到所有导出的字段。

有关详细信息，请参阅[日期和时间字段](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Sense_Hub/Assets/date-time-fields.htm)。