日期函数

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

熟悉其他日期概念

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

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

提示:您的字段是否已被识别为日期(它在“数据”窗格中有日期图标)并且您正在尝试控制它在可视化项中的显示方式?您可能需要对其进行格式化,而不是使用日期函数。例如,您希望将 22Sept2024 显示为 09/24。这是通过设置日期格式而不是计算来处理的。

请参见自定义日期格式和相关主题以了解如何使用日期字段。此页面上的日期函数允许您操作日期计算字段,而不是设置其显示格式。

Tableau 中的可用日期函数

DATE

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

语法DATE(expression)
输出日期
定义在给定数字、字符串或日期 <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>,该日期的指定 <date_part> 中添加了指定的数字 <interval>。例如,将开始日期增加 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><date_part>
示例
DATENAME('year', #3/25/1986#) = "1986"
DATENAME('month', #1986-03-25#) = "March"
说明

支持 ISO 8601 日期。

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

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

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

DATEPARSE

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

语法DATEPARSE(date_format, date_string)
输出日期
定义<date_format> 参数将描述 <date_string> 字段的排列方式。由于可通过各种方式对字符串字段进行排序,因此 <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><date_part>
示例
DATEPART('year', #1986-03-25#) = 1986
DATEPART('month', #1986-03-25#) = 3
说明

支持 ISO 8601 日期。

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

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

DATETRUNC

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

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

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

DATETRUNC(quarter, #9/22/2018#) = #7/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)
输出整数
定义以整数的形式返回给定 <date> 的天。
示例
Day(#September 22, 2018#) = 22
说明另请参见 WEEKMONTHQUARTERYEAR 以及 ISO 等效值。

ISDATE

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

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

ISOQUARTER

语法ISOQUARTER(date)
输出整数
定义以整数的形式返回给定 <date> 的基于 ISO8601 周的季度。
示例
ISOQUARTER(#1986-03-25#) = 1
说明另请参见 ISOWEEKISOWEEKDAYISOYEAR, 以及 -ISO 等效值。

ISOWEEK

语法ISOWEEK(date)
输出整数
定义以整数的形式返回给定 <date> 基于 ISO8601 周的周。
示例
ISOWEEK(#1986-03-25#) = 13
说明另请参见 ISOWEEKDAYISOQUARTERISOYEAR, 以及 -ISO 等效值。

ISOWEEKDAY

语法ISOWEEKDAY(date)
输出整数
定义以整数的形式返回给定 <date> 的基于 ISO8601 周的工作日。
示例
ISOWEEKDAY(#1986-03-25#) = 2
说明另请参见 ISOWEEKISOQUARTERISOYEAR, 以及 -ISO 等效值。

ISOYEAR

语法ISOYEAR(date)
输出整数
定义以整数的形式返回给定 <date> 的基于 ISO8601 年份的工作日。
示例
ISOYEAR(#1986-03-25#) = 1,986
说明另请参见 ISOWEEKISOWEEKDAYISOQUARTER, 以及 -ISO 等效值。

MAKEDATE

语法MAKEDATE(year, month, day)
输出日期
定义返回一个依据指定 <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>的日期时间。日期可以是 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)
输出日期时间
定义返回一个依据指定 <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)
输出与参数相同的数据类型,或者,如果参数的任何部分为 null,则为 NULL
定义

返回两个参数(必须为相同数据类型)中的最大值。

MAX 也可以聚合形式应用于单个字段。

示例
MAX(4,7) = 7
MAX(#3/25/1986#, #2/20/2021#) = #2/20/2021#
MAX([Name]) = "Zander"
说明

对于字符串

MAX 通常是按字母顺序排在最后的值。

对于数据库数据源,MAX 字符串值在数据库为该列定义的排序序列中最高。

对于日期

对于日期,MAX 是最近的日期。如果 MAX 是聚合,结果不会有日期层次结构。如果 MAX 是比较,结果将保留日期层次结构。

作为聚合

MAX(expression) 是聚合函数,返回单个聚合结果。这在可视化项中显示为 AGG(expression)

作为比较

MAX(expr1, expr2) 比较这两个值并返回一个行级值。

另请参见 MIN

MIN

语法MIN(expression)MIN(expr1, expr2)
输出与参数相同的数据类型,或者,如果参数的任何部分为 null,则为 NULL 
定义

返回两个参数(必须为相同数据类型)中的最小值。

MIN 也可以聚合形式应用于单个字段。

示例
MIN(4,7) = 4
MIN(#3/25/1986#, #2/20/2021#) = #3/25/1986#
MIN([Name]) = "Abebi"
说明

对于字符串

MIN 通常是按字母顺序排列在前面的值。

对于数据库数据源,MIN 字符串值在数据库为该列定义的排序序列中最低。

对于日期

对于日期,MIN 是最早的日期。如果 MIN 是聚合,结果不会有日期层次结构。如果 MIN 是比较,结果将保留日期层次结构。

作为聚合

MIN(expression) 是聚合函数,返回单个聚合结果。这在可视化项中显示为 AGG(expression)

作为比较

MIN(expr1, expr2) 比较这两个值并返回一个行级值。

另请参见 MAX

MONTH

语法MONTH(date)
输出整数
定义以整数形式返回给定 <date> 的月份。
示例
MONTH(#1986-03-25#) = 3
说明另请参见 DAYWEEKQUARTERYEAR 以及 ISO 等效值

NOW

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

NOW 不接受参数。

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

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

QUARTER

语法QUARTER(date)
输出整数
定义以整数形式返回给定 <date> 的季度。
示例
QUARTER(#1986-03-25#) = 1
说明另请参见 DAYWEEKMONTHYEAR 以及 ISO 等效值

TODAY

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

TODAY 不接受参数。

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

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

WEEK

语法WEEK(date)
输出整数
定义以整数形式返回给定 <date> 的周。
示例
WEEK(#1986-03-25#) = 13
说明另请参见 DAYMONTHQUARTERYEAR 以及 ISO 等效值

YEAR

语法YEAR(date)
输出整数
定义以整数形式返回给定 <date> 的年份。
示例
YEAR(#1986-03-25#) = 1,986
说明另请参见 DAYWEEKMONTHQUARTER 以及 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)”,并选择“离散”

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

感谢您的反馈!您的反馈已成功提交。谢谢!