考点 2.3.5 Create a calcualted field (e.g. string, date,simple artihmetic)

在开始基础日期函数之前, 我推荐你再复习一下基础基础基础那一张当中, 关于日期的这一课.

日期函数的作用

跟前边的数值计算函数不一样, 数值函数的输入是数值输出也是数值, 所以往往应用起来往往比较简单. 而日期不一样, 日期有很多独特的性质,日期函数往往是围绕着这些独特的性质进行计算. 而且日期函数的输出有时候并不一定是日期, 有时候输入也不一定是日期, 所以在使用日期函数的时候, 必须非常明确你当前所使用的这个日期函数的目的是什么. 或者说这个日期函数到底是干什么的.

我把日期函数的作用分为三种:

1. 创建日期: 把其他形式的数据转化为日期. 比如数字,字符串等等转换成一个日期

2. 定位日期: 定位函数的作用是具体定位一个日期. 比如从今天往前数前三十天, 去年年底的一号, 今年二月份的月底等等.

3. 解析日期: 在得到一个日期之后, 去判断这个日期的年份是多少, 月份是多少, 这一天是星期几等等

这三种函数之间, 最重要的是第二种作用, 其次第三种. 创建日期一般用的最少.

创建一个日期

TODAY( )函数★★★

Today就是今天的意思, 顾名思义Today( )函数返回的就是今天的日期. 在Tableau Dashboard打开的时候, Today( )就是你打开这个报告的日期.

关于Today函数, 你唯一需要记住的是当你把你的Dashboard发布到Tableau Server之后, Today( )是以Tableau Server服务器所使用的那个系统时间来定义的. 如果你在中国打开一个服务器在美国的Tableau Dashboard,那么显示的Today是以美国时间为准的, 即使这个报告是你在中国发布的.

NOW( )函数★

Now是现在的意思, NOW()函数所返回的是此时此刻的日期+时间. 2024-01-01 20:00:00

MAKEDATE( )函数: 通过数字创建日期★

如果我的数据里是时间是分为三个column存在的, Year, Month, Day 而这个三个column当中又都是数字的话, 你就需要使用MAKEDATE( )函数来创建日期.

MAKEDATE(年份数字, 月份数字, 日期数字) → 日期

MAKEDATE(2024,3,13) = 2024-03-13 我在这强调一下, 如果你的数据里月份是带0的话, 03不是一个数字, 这是一个字符, 你必须把字符先转化成数字才行

MAKEDATETIME( )函数★

MAKEDATETIME从名字上和MAKEDATE()很类似, 就是创建一个日期加时间. 但是MAKEDATETIME需要的是一个DATE加上一个时间, 而不是数字, 这点非常重要

MAKEDATETIME(#2012-11-12#, #07:59:00#) → 2012-11-12 07:59:00


解析日期

如果说前边是硬搓出一个日期的话, 那么这个部分主要是根据字符转换日期. 这个函数只有一个, 那就是DATEPARSE( )

DATEPARSE(format, string)

DATEPARSE函数一共有两个输入, 第一个是格式参数, 第二个是要转换的字符串. Tableau官方给出的例子就是

DATEPARSE(“dd.MMM.yyyy“, “15.April.2004“) = 2004-04-15 12:00:00

你能转换的格式千变万化, 因此这个格式参数也是各式各样. 你刚开始学不要把时间浪费在各种格式参数上, 只要知道有这么个函数就行了. 以后用上了再说.


定位日期★★★

定位日期的意思就是我想根据一个基准日期定位另一个日期的时间. 这个'另一个日期'是根据你的基准时间动态变化的.

比如你一个最基本, 去年的今天. 基准日期就是今天, 另一个日期就是去年的今天.

所有时间段或者说Time Interval的计算本质上都是定位日期的计算, 你知道了今天, 知道了去年的今天, 你自然就会计算过去一年包含哪些天了.

常见的定位日期往往包含下边这些术语:

MTD: Month to Date 从本月的一号到今天 → 根据今天计算出本月的一号是哪一天 → 日期>=本月一号 and 日期<=Today( )

YTD: Year to Date 从今年的一月一号到今天 → 根据今天计算出今年的一月一号是哪一天 → 日期>=今年一月一号 and 日期<=Today( )

PMTD: Previous Year Month to Date 从去年的本月一号到去年的今天 → 根据今天计算去年的今天是哪一天 →根据去年的今天去推算去年的今天所在那个月的一月一号→ 日期>=去年的本月一号 and 日期<=去年的今天

当来到PMTD的时候, 你就可以看到需求就已经变的稍微复杂了.

头号重要日期定位函数 DATETRUNC( )★★★

计算月初和年初函数: DATETRUNC(date_part, date)

为啥这个函数这么重要? 我先问你一个问题, 光从这个函数名你能推断出这个函数是干什么的吗? 你猜不到吧, 所以你翻译不过来就说明你记不住. 第二, 这个函数的功能非常常用.

一个经常用但是你又很可能记不住的函数就是非常重要的函数.

首先我们来翻译函数名 DATETRUNC. 这个函数名是DATE加TRUNC. TRUNC是单词Truncate的缩写. Truncate这个单词的含义是截断, 缩短的意思.

如果我们显示一个字符串'1234….' 1234后边的…就表示有数字没显示出来, 这时候我们就说这个数字是Truncated, 被截断了, 没全显示. 但是放在日期这里, 它的含义就是

在1号就把日期截断. 如果我们date_part部分输入的是Month, 那就是截断到这个月的一号, 如果输入的是Year, 那就是截断到这一年的一月一号.

DATRTRUNC('year', #2024-08-30#) 返回的就是2024年的一月一号: 2024-01-01

DATRTRUNC('month', #2024-08-30#)返回的就是2024年8月份的一月一号: 2024-08-01

但是到这这个函数还没有讲完. 如果你最后只记住了这个函数用来计算月初和年初, 那你只得到这个函数的一半真传. 这个函数的另一半真传就是:

DATETRUNC( )同样用来计算年末和月末. Tableau中并没有提供计算月末和年末的函数, 所以你必须月初和年初来计算月末和年末, 那么怎么算?

记住: 你今年的年末就是明年的年初减一天, 你这个月的月末就是下个月的月初减一天, 你想明白了吗?

DATEADD函数 日期加减

DATEADD(datepart, interval, date)

DATEADD就是在Date的基础上+Interval * datepart这么多的时间. DATEADD(‘month‘, 3, #2004-04-15#) → 在2024-04-15 + 3xMonths → 2004-07-15

DATEADD函数唯一需要额外记住的是Interval可不是只能输入正数, 也是可以输入负数的.

DATEADD(‘month‘, -3, #2004-04-15#) 相当于在2004-04-15号的基础上再减三个月, 返回的是2004年1月15号

DATEDIFF函数 日期差函数

DATEDIFF(date_part, StartDate, EndDate)

这个函数就是一个功能, 计算两个日期之间差几天/月/年.

这个函数最容易搞错的就是StartDate和EndDate的位置. 因为在我们的脑海中, 如果你想计算两个日期之间差几天, 你的直觉就是End Date - Start Date

在这个里边你的直觉告诉你 End Date是应该在前边的, 但是DATEDIFF函数不是, Start Date是在前边, End Date是在后边的. 这个顺序是反直觉的