在数据模型中,每个列都有一个关联的数据类型,该数据类型指定该列可以保存的数据类型:整数、小数数字、文本、货币数据、日期和时间等。 数据类型还确定可以对列执行哪些类型的操作,以及存储列中的值所需的内存量。
如果使用的是 Power Pivot 加载项,则可以更改列的数据类型。 如果日期列已作为字符串导入,但需要它是其他内容,则可能需要执行此操作。 有关详细信息,请参阅在 Power Pivot 中 设置列的数据类型 。
本文内容
数据类型摘要
下表列出了数据模型中支持的数据类型。 导入数据或在公式中使用值时,即使原始数据源包含不同的数据类型,数据也会转换为其中一种数据类型。 公式生成的值也使用这些数据类型。
| Excel 中的数据类型 | DAX 中的数据类型 | 说明 |
|---|---|---|
| 整数 | 一个 64 位 (8 个字节) 整数值 1、2 | 没有小数位数的数字。 整数可以是正数或负数, 但必须是介于 -9,223,372,036,854,775,808 (-2^63) 和 9,223,372,036,854,775,807 (2^63-1) 。 |
| 十进制数 | 64 位 (8 字节) 实数 1、2 | 实数是可以具有小数位数的数字。 实数涵盖各种值: 从 -1.79E +308 到 -2.23E -308 的负值 零 从 2.23E -308 到 1.79E + 308 的正值 但是,有效位数限制为 15 位十进制数字。 |
| TRUE/FALSE | 布尔 | 值为 True 或 False。 |
| 文本 | String | Unicode 字符数据字符串。 可以是字符串、数字或以文本格式表示的日期。 最大字符串长度为 268,435,456 个 Unicode 字符 (256 兆字符) 或 536,870,912 字节。 |
| 日期 | 日期/时间 | 接受的日期时间表示形式的日期和时间。 有效日期是 1900 年 1 月 1 日之后的所有日期。 |
| 货币 | 货币 | 货币数据类型允许值介于 -922,337,203,685,477.5808 到 922,337,203,685,477.5807 之间,具有四个固定精度的十进制数字。 |
| 不适用 | 空白 | 空白是 DAX 中表示和替换 SQL null 的数据类型。 可以使用 BLANK 函数创建空白,并使用逻辑函数 ISBLANK 测试空白。 |
1 DAX 公式不支持小于表中列出的数据类型。
2 如果尝试导入具有非常大数值的数据,导入可能会失败并出现以下错误:
内存中数据库错误:“表名称”<表的“列名称>>”<列包含值“1.7976931348623157e+308”,不受支持。 操作已取消。
发生此错误的原因是 Power Pivot 使用该值来表示 null。 以下列表中的值是 null 值的同义词:
| 值 |
|---|
| 9223372036854775807 |
| -9223372036854775808 |
| 1.7976931348623158e+308 |
| 2.2250738585072014e-308 |
从数据中删除值,然后再次尝试导入。
表数据类型
DAX 在许多函数(例如聚合和时间智能计算)中使用表数据类型。 某些函数需要对表的引用;其他函数返回一个表,该表随后可用作其他函数的输入。 在某些需要表作为输入的函数中,可以指定计算结果为表的表达式;对于某些函数,需要引用基表。 有关特定函数的要求的信息,请参阅 DAX 函数参考。
DAX 公式中的隐式和显式数据类型转换
对于用作输入和输出的数据类型,每个 DAX 函数都有特定的要求。 例如,某些函数需要某些参数的整数,而其他函数需要整数;其他函数需要文本或表。
如果指定为参数的列中的数据与函数所需的数据类型不兼容,则在许多情况下,DAX 将返回错误。 但是,只要有可能,DAX 就会尝试将数据隐式转换为所需的数据类型。 例如:
- 可以将日期键入为字符串,DAX 将分析该字符串并尝试将其强制转换为 Windows 日期和时间格式之一。
- 可以添加 TRUE + 1 并获取结果 2,因为 TRUE 隐式转换为数字 1,并且执行操作 1+1。
- 如果在两列中添加值,并且一个值恰好表示为文本 (“12”) ,另一个值表示为数字 (12) ,DAX 会将字符串隐式转换为数字,然后对数值结果执行加法操作。 以下表达式返回 44:= “22” + 22
- 如果尝试连接两个数字,Excel 会将它们显示为字符串,然后连接。 以下表达式返回“1234”:= 12 & 34
下表汇总了在公式中执行的隐式数据类型转换。 Excel 会尽可能根据指定操作的要求执行隐式转换。
隐式数据转换表
执行的转换类型由 运算符确定,运算符在执行请求的操作之前强制转换所需的值。 这些表列出了运算符,并指示在与相交行中的数据类型配对时对列中的每个数据类型执行的转换。
注意
这些表中不包含文本数据类型。 当数字以文本格式表示时,在某些情况下,Power Pivot 将尝试确定数字类型并将其表示为数字。
添加 (+)
| 运算符 (+) | INTEGER | CURRENCY | REAL | 日期/时间 |
|---|---|---|---|---|
| INTEGER | INTEGER | CURRENCY | REAL | 日期/时间 |
| CURRENCY | CURRENCY | CURRENCY | REAL | 日期/时间 |
| REAL | REAL | REAL | REAL | 日期/时间 |
| 日期/时间 | 日期/时间 | 日期/时间 | 日期/时间 | 日期/时间 |
例如,如果在加法运算中将实数与货币数据结合使用,则这两个值将转换为 REAL,结果将返回为 REAL。
减法 (-)
在下表中,行标题是左侧) (小数,列标题是右侧) 子 (。
| 运算符 (-) | INTEGER | CURRENCY | REAL | 日期/时间 |
|---|---|---|---|---|
| INTEGER | INTEGER | CURRENCY | REAL | REAL |
| CURRENCY | CURRENCY | CURRENCY | REAL | REAL |
| REAL | REAL | REAL | REAL | REAL |
| 日期/时间 | 日期/时间 | 日期/时间 | 日期/时间 | 日期/时间 |
例如,如果在具有任何其他数据类型的减法操作中使用日期,则这两个值将转换为日期,并且返回值也是日期。
注意
数据模型还支持一元运算符 - (负) ,但此运算符不会更改操作数的数据类型。
乘法 (*)
| 运算符 (*) | INTEGER | CURRENCY | REAL | 日期/时间 |
|---|---|---|---|---|
| INTEGER | INTEGER | CURRENCY | REAL | INTEGER |
| CURRENCY | CURRENCY | REAL | CURRENCY | CURRENCY |
| REAL | REAL | CURRENCY | REAL | REAL |
例如,如果在乘法运算中将整数与实数组合,则这两个数字将转换为实数,并且返回值也是 REAL。
分区 (/)
在下表中,行标题是分子,列标题是分母。
| 运算符 (/) (行/列) |
INTEGER | CURRENCY | REAL | 日期/时间 |
|---|---|---|---|---|
| INTEGER | REAL | CURRENCY | REAL | REAL |
| CURRENCY | CURRENCY | REAL | CURRENCY | REAL |
| REAL | REAL | REAL | REAL | REAL |
| 日期/时间 | REAL | REAL | REAL | REAL |
例如,如果在除法运算中将整数与货币值组合在一起,则这两个值将转换为实数,结果也是实数。
比较运算符
在比较表达式中,布尔值被视为大于字符串值,字符串值被视为大于数值或日期/时间值;数字和日期/时间值被视为具有相同的排名。 不对布尔值或字符串值执行隐式转换;BLANK 或空白值将转换为 0/“”/false,具体取决于另一个比较值的数据类型。
以下 DAX 表达式说明了此行为:
=IF (FALSE () >“true”,“Expression is true”,“Expression is false”) ,返回“Expression is true”
=IF (“12”>12,“Expression is true”,“Expression is false”) ,返回“Expression is true”。
=IF (“12”=12,“Expression is true”,“Expression is false”) ,返回“Expression is false”
对数字或日期/时间类型隐式执行转换,如下表所述:
| 比较运算符 | INTEGER | CURRENCY | REAL | 日期/时间 |
|---|---|---|---|---|
| INTEGER | INTEGER | CURRENCY | REAL | REAL |
| CURRENCY | CURRENCY | CURRENCY | REAL | REAL |
| REAL | REAL | REAL | REAL | REAL |
| 日期/时间 | REAL | REAL | REAL | 日期/时间 |
处理空白、空字符串和零值
在 DAX 中,null、空白值、空单元格或缺失值都由同一新值类型 BLANK 表示。 还可以使用 BLANK 函数生成空白,或使用 ISBLANK 函数测试空白。
在操作(如加法或串联)中如何处理空白取决于单个函数。 下表以处理空白的方式汇总了 DAX 和 Microsoft Excel 公式之间的差异。
| Expression | DAX | Excel |
|---|---|---|
| 空白 + 空白 | 空白 | 0(零) |
| 空白 +5 | 5 | 5 |
| 空白 * 5 | 空白 | 0(零) |
| 5/BLANK | 无穷 | 错误 |
| 0/BLANK | 南 | 错误 |
| BLANK/BLANK | 空白 | 错误 |
| FALSE 或空白 | FALSE | FALSE |
| FALSE 和空白 | FALSE | FALSE |
| TRUE 或空白 | TRUE | TRUE |
| TRUE 和空白 | FALSE | TRUE |
| 空白或空白 | 空白 | 错误 |
| 空白和空白 | 空白 | 错误 |
有关特定函数或运算符如何处理空白的详细信息,请参阅 DAX 函数参考部分中每个 DAX 函数的单独主题。