在表达式中使用日期时间
可以使用表达式进行日期、日期时间和时间的计算:
- 计算经历的天数,经历的天数和时间,或经历的时间
例如 `20141231` - `20141130` 会返回 31,两个日期之间的天数。
- 对日期、日期时间或时间进行增减调整
例如 `20141231` - 15 返回 16 十二月 2014,15 天前的日期。
- 比较日期、日期时间或时间
例如,`20141231 183000` > `20141231 171500` 返回 T (真),因为第一个时间比第二个时间更晚。
日期和时间函数
为了帮助您使用日期时间数据,Analytics 提供了一些可执行各种有用任务的日期和时间函数。您可以在构建日期时间表达式时使用这些函数。
下表显示了按任务分组的日期时间函数。如果您在表达式生成器中按日期与时间对函数下拉列表进行过滤,则可以看到相同的函数列表。
执行的任务 |
函数 |
---|---|
返回某一日期与某个终止日期或当前日期相比较的帐龄(以天为单位)。 |
|
计算一个日期之前或之后的日期、月末或指定的月数 |
|
标识某个日期的星期几或月份 |
|
对某个日期,返回一个代表星期几的数值(1 到 7) |
|
从日期时间值提取日期或时间 |
|
从日期时间值提取日、月、年、小时、分钟或秒钟 |
|
将序列日期时间值,或字符或数值日期时间值转换为日期时间数据类型的常规日期时间值 |
|
返回当前操作系统日期、日期时间或时间 |
时间量与时间点
当您在表达式中使用日期时间时,您需要区分时间量和时间点,因为两者的区别要求您构建不同类型的表达式。
时间值 08:30:00 可能指时间量 – 8 小时又 30 分钟,也可能指时间点 – 上午 08:30:00。如果您从一个时间中减去另外一个时间,则结果为经过的时间,这是一个时间量。例如:
STOT(`T083000` - `T071500`) 返回 01:15:00(1 小时、15 分钟、0 秒钟)
如果您向某个时间中添加一个数字,或者从某个时间中减去一个数字,则结果为产生另外一个时间点的正的或负的调整量,该时间点晚于或早于初始时间。例如:
`T083000` - (1.00000000/24*1.5) 返回 07:00:00 AM
在第一个示例中,时间显示格式( )为 hh:mm:ss,而在第二个示例中,为 hh:mm:ss PM。这两个示例都涉及序列日期时间计算,在后续部分将对其进行介绍。
与此类似,如果您从一个日期中减去另外一个日期,则结果为经过的天数,这是一个时间量。例如:
`20141231` - `20141130` 会返回 31,即这两个日期之间的天数。
如果您向某个日期中添加一个数字,或者从某个日期中减去一个数字,则结果为另外一个时间点,该时间点晚于或早于初始日期。例如:
`20141231` - 31 返回 2014 年 11 月 30 日,即比初始日期早 31 天的日期。
有效和无效的日期时间表达式
日期时间表达式包括一些日期时间子类型(日期、日期时间和时间)和运算符的可能组合。并不是所有的组合都是有效表达式。例如,您可以用一个日期减去另一个日期以计算经历的天数,但是不能将两个日期相加,因为该运算是不合逻辑的。但是,可以将一个数值加到一个日期以生成一个将来的日期。
如下规则适用于日期时间表达式:
-
日期、日期时间或时间值的任何组合都可用于减法或比较运算。
-
日期、日期时间或时间数值可以减去或加上整数、混合数或小数。
-
日期、日期时间或时间数值不能相加。
如果要加时间,如一周中工作的小时数,可以使用 Analytics 函数将时间的小时、分钟和秒钟数提取为数值。然后可以在那些数值上执行计算。
-
日期、日期时间或时间值不能与数值相比较。
即使表达式有效,对于分析而言也不总是有用。例如,Analytics 会处理表达式 结束日期 > 开始时间,但结果总为真(T),将日期与时间进行比较没有逻辑意义。
下表总结了日期时间表达式可能具有的组合,并且表明每个组合是否有效 — 即能否由 Analytics 处理。
|
日期值 |
日期时间值 |
时间值 |
数目 |
---|---|---|---|---|
日期值 |
有效: 减法 比较 |
有效: 减法 比较 |
有效: 减法 比较 |
有效: 减法 添加 |
无效: 添加 |
无效: 添加 |
无效: 添加 |
无效: 比较 |
|
日期时间值 |
有效: 减法 比较 |
有效: 减法 比较 |
有效: 减法 比较 |
有效: 减法 添加 |
无效: 添加 |
无效: 添加 |
无效: 添加 |
无效: 比较 |
|
时间值 |
有效: 减法 比较 |
有效: 减法 比较 |
有效: 减法 比较 |
有效: 减法 添加 |
无效: 添加 |
无效: 添加 |
无效: 添加 |
无效: 比较 |
日期时间表达式返回的数据类型
日期时间表达式返回结果的数据类型取决于表达式中的数值和运算符:
日期时间表达式 |
结果的数据类型 |
---|---|
减法(仅日期时间值) 减法运算中用到的日期、日期时间或时间值的任意组合 |
数值 序列日期、序列日期时间或序列时间 要了解更多信息,请参考序列日期时间。 |
加法或减法(日期时间值或数值) 日期、日期时间和时间数值可以减去或加上整数、混合数或小数 |
日期时间 日期时间数据类型的日期、日期时间或时间子类型 |
比较(仅日期时间值) 比较运算中用到的日期、日期时间或时间值的任意组合 |
逻辑 T (真) 或 F (假) |
日期时间文本的格式
- 日期时间值 您可以使用下表中列出的日期、分隔符和时间格式的任意组合。
日期必须位于时间的前面,并且您必须在两者之间使用一个分隔符。有效分隔符是单个空格、字母 ‘t’ 或字母 ‘T’。
- 时间值您必须使用 24 小时时钟指定时间
协调世界时 (UTC) 偏移量的前面必须带有一个加号 (+) 或一个减号 (-)。
格式示例
字面量值示例
YYYYMMDD
`20141231`
YYMMDD
`141231`
YYYYMMDD hhmmss
`20141231 235959`
YYMMDDthhmm
`141231t2359`
YYYYMMDDThh
`20141231T23`
YYYYMMDD hhmmss+/-hhmm
(UTC 偏移量)
`20141231 235959-0500`
YYMMDD hhmm+/-hh
(UTC 偏移量)
`141231 2359+01`
thhmmss
`t235959`
Thhmm
`T2359`
说明
在包含 UTC 偏移量数据的主时间格式中,请勿单独使用 hh。例如,请避免:hh+hhmm。结果可能不可靠。
使用函数加上一定的时间
不可以在 Analytics 中直接将时间值相加。但是,可以使用 Analytics 函数将时间的小时、分钟和秒钟部分提取为数值,然后在那些数值上执行计算。如下的时间表数据示例说明了如何使用小时和分钟的方法。
要求多个计算域进行计算:
计算域名称 |
表达式 |
描述 |
---|---|---|
已用时间 |
STOT(结束时间 - 开始时间) |
计算一天工作小时数的减法运算。STOT( ) 函数会将结果从序列时间值转换为常规时间值。 |
小时 |
HOUR(经历的) |
从经历的数值中提取为数值的小时部分。 |
分钟 |
MINUTE(经历的) |
从经历的数值中提取为数值的分钟数。 (用于显示目的。计算不要求。) |
部分小时数 |
MINUTE(经历的)/60.000 |
从经历的数值中提取为数值的分钟部分,计算结果为 60 分钟的小数部分。 |
小时+部分小时 |
小时+部分小时 |
数值小时和部分小时相加。 |
最后一步,可以汇总小时+部分小时域以计算该周的总小时数:
对日期、日期时间或时间进行增减调整
可以对日期、日期时间或时间值进行增减调整 – 例如,增加或减少 15 天,或者增加或减少 3 小时。对日期进行增减调整很直观。可以增加或减少要求的天数以基于一个日期计算另一个日期:
- `20141231` + 15 返回 15 一月 2015
- `20141231` - 15 返回 16 十二月 2014
对日期时间或时间值进行增减调整,某种程度上更复杂。可以直接彼此增加时间值,或者将时间值加到日期时间值。例如,如果要使用如下表达式增加 3 个小时,会报 “表达式类型不匹配”的错误:
- `t120000` + `t030000`
- `20141231 235959` + `t030000`
可以通过增加等于 3 小时 (0.125) 的序列时间值创建一个有效的表达式,但是手工创建这样的表达式会很麻烦,因为创建过程要求知道相等的序列时间:
- `t120000` + 0.125 返回 15:00:00
- `20141231 235959` + 0.125 返回 01 一月 2015 02:59:59
对日期时间或时间值进行减少调整更容易,但是结果是序列日期时间值,必须转换为常规日期时间或时间值以更具可读性:
- `t120000` - `t030000` 返回 0.37500000000000
- STOT(`t120000` - `t030000`) 返回 09:00:00
如下方法使用户对日期时间或时间值进行增减调整更简单:
- 创建一个计算域计算要增减时间量的相等序列时间值。
例如:(1.00000000/24*2.5) 会生成与 2-1/2 小时 (0.10416668) 相等的序列时间。需要用小数位的多个零指定‘1’以确保 Analytics 不会将结果四舍五入。您可以更改乘数值以得到适当的小时数:(1.00000000/24*1)、(1.00000000/24*8)、(1.00000000/24*10.25) 等。
- 在相同的计算域中,将源时间或日期时间值增减所计算的序列时间。
例如:<时间或日期时间域> + (1.00000000/24*2.5) = 域值 + 2-1/2 小时。
- 如果要同时对日期时间值增减天数和时间,请在计算中包含一个恰当的天数。
例如:<日期时间域> + 2 + (1.00000000/24*2.5) = 域值 + 2 天 和 2-1/2 小时。
日期时间表达式示例
下表提供了有效的日期时间表达式的示例。
说明
在一些示例中,返回的结果是序列日期时间 - 即被表示为 24 小时的整数或十进制小数部分的日期、日期时间或时间值。
可以使用 STOD( )、STODT( ) 和 STOT( ) 函数将序列日期时间结果转化为常规日期时间值。要了解更多信息,请参考序列日期时间。
计算经历的天数、天数和时间,或者时间
表达式 |
结果 |
---|---|
`20141231` - `20141130` |
31 两个日期之间经历的天数 |
结束日期 - 开始日期 |
结束日期和开始日期值之间经历的天数 |
`20141231 235959` - `20141130 114530` |
31.51005787037037 两个日期时间之间经历的天数和时间,表示为序列日期时间 |
STRING(INT(`20141231 235959` - `20141130 114530`),5) + " " + TIME(STOT(MOD(`20141231 235959` - `20141130 114530`, 1))) |
31 12:14:29 上例所示,两个日期时间之间经历的天数和时间,表达为天数、小时、分钟和秒钟 假定当前 Analytics 时间显示格式为 hh:mm:ss |
结束的日期时间 - 开始的日期时间 |
结束日期时间和开始日期时间值之间经过的天数和时间,表示为序列日期时间 |
STRING(INT(结束的日期时间 - 开始的日期时间), 5) + " " + TIME(STOT(MOD(结束的日期时间 - 开始的日期时间, 1))) |
结束日期时间和开始日期时间值之间经过的天数和时间,表示为天数、小时数、分钟数和秒钟数 |
`T235959` - `T114530` |
0.51005787037037 两个时间之间经历的时间,表示为序列时间 |
STOT(0.51005787037037) |
12:14:29 上例所示,使用当前 Analytics 时间显示格式将序列时间转换为时间值 |
STOT(`T235959` - `T114530`) |
12:14:29 两次时间之间经历的时间,使用当前 Analytics 时间显示格式表示为时间 |
结束时间 - 开始时间 |
结束时间和开始时间值之间经历的时间,表达为序列值 |
对日期、日期时间或时间进行增减调整
表达式 |
结果 |
---|---|
到期日期 + 15 |
到期日期域中的值增加 15 天 |
`20141231` - 15 |
16 十二月 2014 日期递减15天。假定当前 Analytics 日期显示格式为 DD MMM YYYY |
`20141231 235959` + (1.00000000/24*1.5) |
01 一月 2015 01:29:59 日期时间加上 1.5 小时 |
`20141231 235959` - (1.00000000/24*1.5) |
31 十二月 2014 22:29:59 日期时间减去 1.5 小时 |
STODT(`20141231 235959` - `T013000`) |
31 十二月 2014 22:29:59 日期时间减去 1.5 小时 |
`20141231 235959` + 2 + (1.00000000/24*1.5) |
03 一月 2015 01:29:59 日期时间加 2 天和 1.5 小时 |
`20141231 235959` - 2 - (1.00000000/24*1.5) |
29 十二月 2014 22:29:59 日期时间减去 2 天和 1.5 小时 |
`t235959` + (1.00000000/24*1.5) |
01:29:59 时间加上 1.5 小时 |
`T173000` - (1.00000000/24*1.5) |
16:00:00 时间减去 1.5 小时 |
STOT(`T173000` - `T013000`) |
16:00:00 时间减去 1.5 小时 |
STOT(STOT(`T173000` - `T013000`) - `T010000`) |
15:00:00 时间减去 1.5 小时,再减去 1 小时 |
比较日期、日期时间或时间
表达式 |
结果 |
---|---|
`20141231` > `20141230` |
T(真) |
到期日期 <= `20141231` |
“到期日期”域中所有不晚于 2014 年 12 月 31 日的值 |
付款日期 > 到期日期 |
“付款日期”域中所有超过其到期日期的值 |
CTOD(DATE(付款日期时间戳, "YYYYMMDD"), "YYYYMMDD") > 到期日期 |
“付款时间戳”域中所有超过其到期日期的值 要比较日期时间或日期值,会在付款日期时间戳域中从日期时间值将日期首先提取为字符值,然后转换回日期值以与到期日期进行比较。 要确保日期格式一致,要为 DATE( ) 格式参数(输出格式)和 CTOD( ) 格式参数(输入格式)指定相同的格式。 |
登录时间 > `t100000` |
登录时间域中所有的值都晚于 10:00:00 |
使用转换函数的日期时间表达式
表达式 |
结果 |
---|---|
STOT(CTOT("t120000") - CTOT("t090000") ) |
03:00:00 两个字符时间值之间经历的时间 字符时间值首先被转换为常规时间值,以便用于减法运算。减法运算得到的数值序列时间随后被转换为常规时间值。 |
CTOT(TIME(`20141231 125959`)) < `T235959` |
T(真) 时间首先被从日期时间值提取为字符值,然后被转换为时间值以与 23:59:59 进行比较。 |