Date & DateTime(日期与时间)
这节的目标很简单:先把“时间怎么定位”弄清楚,再避开相对时间的坑,最后用一个好用的视图把你的计算校一遍。
1) 时间是有顺序的,这件事很重要
- 任何数据集都有最早和最晚两个日期。第一次摸一个新表,先看 Min Date 和 Max Date,心里才有数。
- 可以把日期想成一条数轴:把 1900-01-01 当 0,往后每一天 +1。这样你就知道,日期能比较大小,也能做加减。
- 但加减不是随便加减。关键是“对齐边界”:加到年初、月初、周初还是日初?边界不对,结果一定跑偏。
2) 绝对时间 vs 相对时间
- 绝对时间好理解:2000-01-01 放哪儿看都是那一天。
- 相对时间会“动”:昨天、今年、上季度……跟当前时点绑在一起。
- 常用区间:
- YTD(Year to Date):当年第一天 → 今天。
- PYTD(Previous YTD):上一年第一天 → 去年“同一天”。
3) 少把 TODAY() 写死在计算里
新手最容易踩的坑:把 TODAY() 写进一堆计算。几个月后领导说“我想看当时12月的这个月”,你发现全错位。
- 更稳的做法:
- 好处:能回溯历史、不怕系统日期变化、回归测试更省心。
1) 做个参数 [As Of Date],默认是 TODAY(),但可以手动改。
2) 所有相对时间计算都基于这个参数,不直接用 TODAY()。
4) 对“特殊日期”要有雷达
节假日、店休、系统故障、极端天气……都会造成人为的波动。把这些日子单独做成一张“特殊日期表”,加个 Boolean 标记,图上高亮出来,解释异常更顺手。
5) 日期格式这件小事
Tableau 提供一堆日期格式选项,但总有你想要的样式不在列表里。没关系,思路就是“拆开再拼”:把年、月、日转成文本,再用你想要的格式拼起来,比如 FY-24 Jun-01。记住,显示格式不改变底层值,计算尽量对着 Date 类型来。
6) Date Hierarchy(日期层级)
- 常规层级:Year → Quarter → Month → Date。
- Week 不在这条直线里。为啥?因为一周可能跨月、甚至跨年,跟“年/月/日”这套边界天生对不齐。
- 想用“周”做分析,先统一口径:ISO 周还是业务周?最稳是用一张日期维表把
ISO_Year、ISO_Week这类字段都准备好。
7) Calendar View(日历视图)超好用
我把它当“时间计算的单元测试台”。
- 步骤:
1) 先搭一个日历视图;
2) 把 YTD、PYTD、Rolling 28 Days 这些标记扔上去;
3) 一天一天看边界对不对,确认无误再做最终图表。
8) 直接拿去用的小片段
- 参数:
[As Of Date](Date),默认 TODAY()。 - 当年第一天:
MAKEDATE(YEAR([As Of Date]), 1, 1)- 本年 YTD:
[Order Date] >= MAKEDATE(YEAR([As Of Date]), 1, 1)
AND [Order Date] <= [As Of Date]- 上年 PYTD(同自然日):
DATEADD('year', -1, [Order Date]) >= MAKEDATE(YEAR(DATEADD('year', -1, [As Of Date])), 1, 1)
AND DATEADD('year', -1, [Order Date]) <= DATEADD('year', -1, [As Of Date])- 滚动 28 天:
[Order Date] > DATEADD('day', -28, [As Of Date])
AND [Order Date] <= [As Of Date]- ISO 周:采用“周一为周首”,最好由日期维表提供
ISO_Year与ISO_Week。
小结
- 先定“基准日期参数”,再写相对时间,能回看历史也不怕错位。
- 用“周”前先定规则,用维表把口径钉死。
- 上线前用 Calendar View 把边界过一遍,心里踏实。