日期是许多数据源中的常见元素。如果字段包含可识别的日期,它将具有日期日期时间数据类型。在可视化项中使用日期字段时,它们会获得一组特殊的功能,包括自动的日期层次钻取、特定于日期的筛选器选项和专门的日期格式化选项。

日期函数允许您对数据源中的日期进行操作。

日期函数

日期函数有时引用特定于日期的元素,包括 date_part 参数、可选的l [start_of_week] 参数和日期文本 (#)。这些元素将在本主题的末尾详细介绍。

还有其他几个可能感兴趣但不属于日期函数的主题:

DATE

将字符串和数字表达式转换为日期的类型转换函数,只要它们是可识别的格式。

语法 DATE(expression)
输出 日期
定义 在给定数字、字符串或日期表达式的情况下返回日期。
示例
DATE([Employee Start Date])
DATE("September 22, 2018") 
DATE("9/22/2018")
DATE(#2018-09-22 14:52#)
说明

与 DATEPARSE 不同,不需要提供模式,因为 DATE 会自动识别许多标准日期格式。但是,如果 DATE 不能识别输入,请尝试使用 DATEPARSE 并指定格式。

MAKEDATE 是另一个类似的函数,但是 MAKEDATE 要求输入年、月和日的数值。

DATEADD

将指定数量的日期部分(月、日等)添加到开始日期。

语法 DATEADD(date_part, interval, date)
输出 日期
定义 返回指定日期,该日期的指定 date_part 中添加了指定的数字间隔。例如,将开始日期增加 3 个月或 12 天。
示例

将所有的到期日推迟一周

DATEADD('week', 1, [due date])

 

将 2021 年 2 月 20 日加上 280 天

DATEADD('day', 280, #2/20/21#) = #November 27, 2021#
说明 支持 ISO 8601 日期。

DATEDIFF

返回两个日期之间的日期部分(周、年等)的数量。

语法 DATEDIFF(date_part, date1, date2, [start_of_week])
输出 整数
定义 返回 date1 与 date2 之差(以 date_part 的单位表示)。例如,减去某人加入和离开乐队的日期,就可以知道他们在乐队里呆了多久。
示例

1986 年 3 月 25 日到 2021 年 2 月 20 日之间的天数

DATEDIFF('day', #3/25/1986#, #2/20/2021#) = 12,751

 

一个人在乐队里呆了几个月

DATEDIFF('month', [date joined band], [date left band])
说明 支持 ISO 8601 日期。

DATENAME

以离散字符串形式返回指定日期部分的名称。

语法 DATENAME(date_part, date, [start_of_week])
输出 字符串
定义 以字符串形式返回日期的 date_part。
示例
DATENAME('year', #3/25/1986#) = "1986"
DATENAME('month', #1986-03-25#) = "March"
说明

支持 ISO 8601 日期。

一个非常类似的计算是 DATEPART,它以连续整数的形式返回指定日期部分的值。DATEPART 可能更快,因为它是一个数值运算。

通过更改计算结果的属性(维度或度量、连续或离散)和日期格式,可以将 DATEPART 和 DATENAME 的结果格式设置为相同。

反函数是 DATEPARSE,它接受一个字符串值并将其格式化为日期。

DATEPARSE

以日期形式返回特定格式的字符串。

语法 DATEPARSE(date_format, [date_string])
输出 日期
定义 date_format 参数将描述 [字符串] 字段的排列方式。由于可通过各种方式对字符串字段进行排序,因此 date_format 必须完全匹配。有关完整解释,请参见将字段转换为日期字段
示例
DATEPARSE('yyyy-MM-dd', "1986-03-25") = #March 25, 1986#
说明

DATE 是一个类似的函数,可以自动识别许多标准的日期格式。如果 DATE 不能识别输入模式,DATEPARSE 可能是更好的选择。

MAKEDATE 是另一个类似的函数,但是 MAKEDATE 要求输入年、月和日的数值。

反函数是 DATEPART(整数输出)和 DATENAME(字符串输出),它将日期分开并返回其各部分的值。

数据库限制

DATEPARSE 可通过以下连接器获得:非旧版 Excel 和文本文件连接、Amazon EMR Hadoop Hive、Cloudera Hadoop、Google 表格、Hortonworks Hadoop Hive、MapR Hadoop Hive、MySQL、Oracle、PostgreSQL 以及 Tableau 数据提取。有些格式可能并非适用于所有连接。

Hive 变体不支持 DATEPARSE。仅支持 Denodo、Drill 和 Snowflake。

DATEPART

以整数形式返回指定日期部分的名称。

语法 DATEPART(date_part, date, [start_of_week])
输出 整数
定义 以整数形式返回日期的 date_part。
示例
DATEPART('year', #1986-03-25#) = 1986
DATEPART('month', #1986-03-25#) = 3
说明

支持 ISO 8601 日期。

一个非常类似的计算是 DATENAME,它以离散字符串的形式返回指定日期部分的名称。DATEPART 可能更快,因为它是一个数值运算。通过更改字段的属性(维度或度量、连续或离散)和日期格式,可以将 DATEPART 和 DATENAME 的结果格式设置为相同。

反函数是 DATEPARSE,它接受一个字符串值并将其格式化为日期。

DATETRUNC

可以将此函数视为日期舍入。它获取特定的日期,并返回该日期在所需的特定程度上的版本。由于每个日期都必须有日、月、季度和年的值,因此 DATETRUNC 将这些值设置为指定日期部分之前每个日期部分的最小值。有关详细信息,请参考见示例。

语法 DATETRUNC(date_part, date, [start_of_week])
输出 日期
定义 按 date_part 指定的准确度截断日期。此函数返回新日期。例如,以月份级别截断处于月份中间的日期时,此函数返回当月的第一天。
示例
DATETRUNC(‘day’, #9/22/2018#) = #9/22/2018#
DATETRUNC(‘week’, #9/22/2018#) = #9/16/2018# 

(包含 2018 年 9 月 22 日的一周中的星期日)

DATETRUNC(‘iso-week’, #9/22/2018#) = #9/17/2018#      

(包含 2018 年 9 月 22 日的一周中的星期一)

DATETRUNC(month, #9/22/2018#) = #9/1/2018#      

(包含 2018 年 9 月 22 日的月份的第一天)

DATETRUNC(quarter, #9/22/2018#) = #7/1/2018# 

(包含 2018 年 9 月 22 日的季度的第一天)

DATETRUNC(‘week’, #9/22/2018#) = #1/1/2018#      

(包含 2018 年 9 月 22 日的年度的第一天)

注意:对于周和 iso 周,start_of_week 有作用。ISO 周始终从星期一开始。对于本例的区域设置,未指定的 start_of_week 意味着一周从星期日开始。

说明

支持 ISO 8601 日期。

例如,您不会使用 DATETRUNC 来停止在可视化项中显示日期时间字段的时间。如果要截断日期的显示而不是舍入其精度,请调整格式。

举例来说,如果显示在第二个可视化项中,DATETRUNC('day', #5/17/2022 3:12:48 PM#) 将显示为 5/17/2022 12:00:00 AM。

DAY

以整数形式返回一个月中的第几天 (1-31)。

语法 DAY(date)
输出 整数
定义 以整数的形式返回给定日期的天。
示例
Day(#September 22, 2018#) = 22
说明 另请参见 WEEK、MONTH、QUARTER、YEAR 和 ISO 等效值

ISDATE

检查字符串是否为有效的日期格式。

语法 ISDATE(string)
输出 布尔值
定义 如果给定字符串为有效日期,则返回 true。
示例
ISDATE(09/22/2018) = true
ISDATE(22SEP18) = false
说明 所需的参数必须是字符串。ISDATE 不能用于日期数据类型的字段,计算将返回错误。

MAKEDATE

语法 MAKEDATE(year, month, day)
输出 日期
定义 返回一个依据指定年份、月份和日期构造的日期值。
示例
MAKEDATE(1986,3,25) = #1986-03-25#

请注意,输入错误的值将被调整为一个日期,例如 MAKEDATE(2020,4,31) = May 1, 2020,而不是返回指出没有 4 月 31 日的错误。

说明

可用于 Tableau 数据提取。检查在其他数据源中的可用性。

MAKEDATE 要求为日期的各个部分输入数字。如果您的数据是应该是日期的字符串,请尝试 DATE 函数。DATE 可自动识别许多标准的日期格式。如果 DATE 不能识别输入,请尝试使用 DATEPARSE。

MAKEDATETIME

语法 MAKEDATETIME(date, time)
输出 日期时间
定义 返回合并了 date 和 time 的 datetime。日期可以是 date、datetime 或 string 类型。时间必须是 datetime。
示例
MAKEDATETIME("1899-12-30", #07:59:00#) = #12/30/1899 7:59:00 AM#
MAKEDATETIME([Date], [Time]) = #1/1/2001 6:00:00 AM#
说明

此函数仅适用于与 MySQL 兼容的连接(对于 Tableau 为 MySQL 和 Amazon Aurora)。

MAKETIME 是一个类似的函数,可用于 Tableau 数据提取和其他一些数据源。

MAKETIME

语法 MAKETIME(hour, minute, second)
输出 日期时间
定义 返回一个依据指定小时、分钟和秒构造的日期值。
示例
MAKETIME(14, 52, 40) = #1/1/1899 14:52:40#
说明

由于 Tableau 不支持时间数据类型,只支持日期时间,因此输出是日期时间。字段的日期部分将是 1/1/1899。

类似于 MAKEDATETIME 的函数,只适用于 MYSQL 兼容的连接。

MAX

语法 MAX(expression)MAX(expr1, expr2)
输出 日期(请参见注释)
定义 MAX 通常应用于数字,不过也适用于日期。返回一个日期字段或两个日期的最大值(最近值)。
示例
MAX(#Sept 22, 2018#, #Feb 20, 2021#) = #Feb 20, 2021#
MAX([Ship date])
说明

MAX(expression) 被视为聚合函数,返回单个聚合结果。这将在可视化项中显示为 AGG([calculation name]),并且没有日期层次结构。

MAX(expr1, expr2) 比较这两个值并返回一个行级值。对于日期,该值将是一个日期,结果将保留日期层次结构。

如果任何参数为 Null,则返回 Null。

MIN

语法 MIN(expression)MIN(expr1, expr2)
输出 日期(请参见注释)
定义 MIN 通常应用于数字,不过也适用于日期。返回一个日期字段或两个日期中的最小值(最早值)。
示例
MIN(#Sept 22, 2018#, #Feb 20, 2021#) = #Sept 22, 2018#
MIN(Ship date])
说明

MIN(expression) 被视为聚合函数,返回单个聚合结果。这将在可视化项中显示为 AGG([calculation name]),并且没有日期层次结构。

MIN(expr1, expr2) 比较这两个值并返回一个行级值。对于日期,该值将是一个日期,结果将保留日期层次结构。

如果任何参数为 Null,则返回 Null。

MONTH

语法 MONTH(date)
输出 整数
定义 以整数的形式返回给定日期的月份。
示例
MONTH(#1986-03-25#) = 3
说明 另请参见 DAY、WEEK、QUARTER、YEAR 和 ISO 等效值。

NOW

语法 NOW()
输出 日期时间
定义 返回当前本地系统日期和时间。
示例
NOW() = 1986-03-25 1:08:21 PM
说明

NOW 不接受参数。

另请参见返回日期而不是日期时间的类似计算 TODAY。

如果数据源是实时连接,则系统日期和时间可能位于另一个时区。有关如何解决此问题的详细信息,请参见知识库

QUARTER

语法 QUARTER(date)
输出 整数
定义 以整数的形式返回给定日期的季度。
示例
QUARTER(#1986-03-25#) = 1
说明 另请参见 DAY、WEEK、MONTH、YEAR 和 ISO 等效值。

TODAY

语法 TODAY()
输出 日期
定义 返回当前本地系统日期。
示例
TODAY() = 1986-03-25
说明

TODAY 不接受参数。

另请参见返回日期时间而不是日期的类似计算 NOW。

如果数据源是实时连接,则系统日期可能位于另一个时区。有关如何解决此问题的详细信息,请参见知识库

WEEK

语法 WEEK(date)
输出 整数
定义 以整数的形式返回给定日期的周。
示例
WEEK(#1986-03-25#) = 13
说明 另请参见 DAY、MONTH、QUARTER、YEAR 和 ISO 等效值。

YEAR

语法 YEAR(date)
输出 整数
定义 以整数的形式返回给定日期的年份。
示例
YEAR(#1986-03-25#) = 1,986
说明 另请参见 DAY、WEEK、MONTH、QUARTER 和 ISO 等效值。

ISOQUARTER

语法 ISOQUARTER(date)
输出 整数
定义 以整数的形式返回给定日期的基于 ISO8601 周的季度。
示例
ISOQUARTER(#1986-03-25#) = 1
说明 另请参见 ISOWEEK、ISOWEEKDAY、ISOYEAR 和非 ISO 等效值。

ISOWEEK

语法 ISOWEEK(date)
输出 整数
定义 以整数的形式返回给定日期基于 ISO8601 周的周。
示例
ISOWEEK(#1986-03-25#) = 13
说明 另请参见SOWEEKDAY、ISOQUARTER、ISOYEAR 和非 ISO 等效值。

ISOWEEKDAY

语法 ISOWEEKDAY(date)
输出 整数
定义 以整数的形式返回给定日期基于 ISO8601 周的平日。
示例
ISOWEEKDAY(#1986-03-25#) = 2
说明 另请参见 ISOWEEK、ISOQUARTER、ISOYEAR 和非 ISO 等效值

ISOYEAR

语法 ISOYEAR(date)
输出 整数
定义 以整数的形式返回给定日期的基于 ISO8601 周的年。
示例
ISOYEAR(#1986-03-25#) = 1,986
说明 另请参见 ISOWEEK、ISOWEEKDAY、ISOQUARTER 和非 ISO 等效值。

date_part 参数

Tableau 中的许多日期函数都采用参数 date_part,这是一个字符串常量,它告诉函数要考虑日期的哪一部分,例如日、周、季度等。

您可以使用的有效 date_part 值为:

date_part
'year' 四位数年份
'quarter' 1-4
'month' 1-12 或 "January"、"February" 等
'dayofyear' 一年中的第几天;1 月 1 日为 1、2 月 1 日为 32,依此类推
'day' 1-31
'weekday' 1-7 或 "Sunday"、"Monday" 等
'week' 1-52
'hour' 0-23
'minute' 0-59
'second' 0-60
'iso-year' 4 位数 ISO 8601 年份
'iso-quarter' 1-4
'iso-week' 1-52,每周始终从星期一开始
'iso-weekday' 1-7,每周始终从星期一开始

[start_of_week] 参数

某些函数有可选参数 [start_of_week]start_of_week 参数可用于指定哪一天被视为一周的第一天,例如“Sunday”或“Monday”。如果省略它,则一周的开始由数据源确定。请参见数据源的日期属性

在下面的例子中,9 月 22 日是星期日,9 月 24 日是星期二。DATEDIFF 函数用于计算这些日期之间的周数。

DATEDIFF('week', #2013-09-22#, #2013-09-24#, 'monday') = 1

  • 由于 start_of_week 为“monday”(星期一),因此这些日期在不同的周中。

DATEDIFF('week', #2013-09-22#, #2013-09-24#, 'sunday') = 0

  • 由于 start_of_week 为“sunday”(星期日),因此这些日期在同一周内。

日期文本 (#)

示例通常在日期表达式中使用井号 (#)。这是日期文本,类似于对文本字符串使用引号,它告诉 Tableau 符号内的值是日期。

如果没有日期文本,日期可能会被解释为各种其他数据类型。例如:

格式 数据类型
'March 25, 1986' 字符串 'March 25, 1986'
#3/25/1986# 日期 #3/25/1986#
03/25/1986 浮点小数 0.00006042
1986-03-25 整数 1,958
03/25/1986   无效

有关详细信息,请参见文本表达式语法

创建日期计算

练习使用 Superstore 示例数据源创建日期计算。

  1. 在 Tableau Desktop 中,连接到 Tableau 附带的“Sample - Superstore”已保存数据源。
  2. 打开一个工作表。
  3. 从“数据”窗格中的“维度”下,将“Order Date”(订单日期)拖到“行”功能区。
  4. 在“”功能区上,单击“YEAR(Order Date)”字段上的加号图标 (+)。

    “QUARTER(Order Date)”将添加到“行”功能区,并且视图将更新。

  5. “行”功能区上,单击“QUARTER(Order Date)”字段上的加号图标 (+),以下钻到“MONTH(Order Date)”。

  6. 选择“分析”>“创建计算字段”
  7. 在打开的计算编辑器中,执行以下操作:
    • 将计算字段命名为“Quarter Date”(季度日期)。
    • 输入以下公式:DATETRUNC('quarter', [Order Date])
    • 完成后,单击“确定”

      新的日期计算将出现在“数据”窗格中的“维度”下。就像其他字段一样,您可以在一个或多个可视化项中使用该字段。

  8. 从“数据”窗格中的“维度”下,将“Quarter Date”(季度日期)拖到“行”功能区,并将其放在“MONTH(Order Date)”右侧。可视化项将更新为包含年份值。这是因为 Tableau 将日期数据累积到最高详细级别。
  9. 在“行”功能区上,右键单击“YEAR(Quarter Date)”,并选择“精确日期”
  10. 在“行”功能区上,再次右键单击“YEAR(Quarter Date)”,并选择“离散”

    可视化项将更新为包含表中每一行的准确季度日期。

感谢您的反馈!