在表达式中使用数据类型 (Reporting Services)

数据类型表示不同种类的数据,以便能够有效地进行存储和处理。典型的数据类型包括文本(也称为字符串)、带有小数位和不带小数位的数字、日期和时间以及图像。存储数据时可以采用一种有助于提高效率的数据类型,但是在报表中显示数据时可以根据自己的喜好设置数据的格式。例如,表示货币的字段可以用浮点数来存储,但是可以根据您所选择的格式属性而以不同的格式显示。有关显示格式的详细信息,请参阅设置报表和报表项的格式

编写的表达式用于比较或组合值(例如,定义组或筛选表达式,或者计算聚合)时,了解数据类型是非常重要的。比较和计算都只在数据类型相同的项之间才有效。如果数据类型不匹配,必须使用表达式显式转换报表项中的数据类型。下面列出可能需要将数据转换为其他数据类型的情况:

  • 将一种数据类型的报表参数值与另一种数据类型的数据集字段进行比较。

  • 编写用于比较不同数据类型的值的筛选表达式。

  • 编写用于组合不同数据类型的字段的排序表达式。

  • 编写用于组合不同数据类型的字段的组表达式。

  • 将从数据源检索的值从一种数据类型转换为另一种数据类型。

确定报表数据的数据类型

若要确定报表项的数据类型,可以编写一个返回报表项数据类型的表达式。例如,若要显示字段 MyField 的数据类型,可在表单元中添加以下表达式:=Fields!MyField.Value.GetDataType().ToString()。结果将显示用于表示 MyField 的 CLR 数据类型,例如 System.String 或 System.DateTime。

将数据集字段转换为其他数据类型

在报表中使用数据集字段之前,还可以对这些字段进行转换。下面列出可用于转换现有数据集字段的方法:

  • 修改数据集查询,以添加含有已转换数据的新查询字段。对于关系数据源或多维数据源,将使用数据源资源来执行转换。
  1. 基于现有报表数据集字段创建计算字段,方法是编写一个表达式,将一个结果集列中的所有数据都转换到具有另一数据类型的新列。例如,以下表达式将字段 Year 从整数值转换为字符串值:=CStr(Fields!Year.Value)。有关详细信息,请参阅如何在“报表数据”窗格中添加、编辑或删除字段
  • 检查所使用的数据处理扩展插件是否包括用于检索预先设定格式的数据的元数据。例如,SQL ServerAnalysis Services MDX 查询包括 FORMATTED_VALUE 扩展属性,用于已在处理多维数据集时设定格式的多维数据集值。有关详细信息,请参阅为 Analysis Services 数据集使用扩展字段属性

了解参数数据类型

报表参数必须是下列五种数据类型之一:Boolean、DateTime、Integer、Float 或 Text(也称为 String)。数据集查询包含查询参数时,将会自动创建报表参数,并将其链接到查询参数。报表参数的默认数据类型是 String。若要更改报表参数的默认数据类型,请在**“报表参数属性”对话框的“常规”页上,从“数据类型”**下拉列表中选择正确的值。

注意注意

DateTime 数据类型的报表参数不支持毫秒。尽管可以创建基于包含毫秒值的参数,但是不能从包含具有毫秒的 Date 或 Time 值的可用值下拉列表中选择值。

编写用于转换数据类型或提取部分数据的表达式

使用连接操作符 (&) 组合文本和数据集字段时,公共语言运行时 (CLR) 通常提供默认格式。需要将数据集字段或参数显式转换为特定数据类型时,必须使用 CLR 方法或 Visual Basic 运行时库函数来转换数据。

下表提供了转换数据类型的示例。

转换类型

示例

从 DateTime 到 String

=CStr(Fields!Date.Value)

从 String 到 DateTime

=DateTime.Parse(Fields!DateTimeinStringFormat.Value)

从 String 到 DateTimeOffset

=DateTimeOffset.Parse(Fields!DateTimeOffsetinStringFormat.Value)

提取 Year

=Year(Fields!TimeinStringFormat.Value)

-- or --

=Year(Fields!TimeinDateTimeFormat.Value)

从 Boolean 到 Integer

=CInt(Parameters!BooleanField.Value)

-1 为 True,0 为 False。

从 Boolean 到 Integer

=System.Convert.ToInt32(Fields!BooleanFormat.Value)

1 为 True,0 为 False。

只需 DateTimeOffset 值的 DateTime 部分

=Fields!MyDatetimeOffset.Value.DateTime

只需 DateTimeOffset 值的 Offset 部分

=Fields!MyDatetimeOffset.Value.Offset

还可以使用 Format 函数控制值的显示格式。有关详细信息,请参阅 Functions (Visual Basic)(函数 (Visual Basic))。

高级示例

使用不对数据源中所有数据类型都提供转换支持的数据访问接口连接到数据源时,不支持的数据源类型的默认数据类型为 String。下面的示例提供针对作为字符串返回的特定数据类型的解决方案。

串联 String 和 CLR DateTimeOffset 数据类型

对于大多数数据类型,CLR 提供默认转换,因此您可以使用 & 运算符将不同数据类型的值串联到一个字符串中。例如,下面的表达式将文本“The date and time are: ”与数据集字段 StartDate(这是一个 System..::..DateTime 值)相串联:="The date and time are: " & Fields!StartDate.Value。

对于某些数据类型,可能需要包含 ToString 函数。例如,下面的表达式使用 CLR 数据类型 System..::..DateTimeOffset 演示相同示例,该数据类型值包括日期、时间和相对于 UTC 时区的时区偏移量:="The time is: " & Fields!StartDate.Value.ToString()。

将 String 数据类型转换为 CLR DateTime 数据类型

如果数据处理扩展插件不支持对某一数据源定义的所有数据类型,则其中的数据可能会作为文本来检索。例如,datetimeoffset(7) 数据类型值可能会作为 String 数据类型来检索。在澳大利亚的珀斯(Perth)市,2008 年 7 月 1 日上午 6:05:07.9999999 的字符串值如下:

2008-07-01 06:05:07.9999999 +08:00

此示例演示的是日期(2008 年 7 月 1 日),后跟 7 位精度的时间(上午 6:05:07.9999999),再跟以小时和分钟表示的 UTC 时区偏移量(加 8 小时、0 分钟)。对于以下示例,此值已放入名为 MyDateTime.Value 的 String 字段中。

可以使用下列策略之一将此数据转换为一个或多个 CLR 值:

  • 在文本框中,使用表达式提取部分字符串。例如:

    • 下面的表达式只提取 UTC 时区偏移量的小时部分,并将其转换为分钟:=CInt(Fields!MyDateTime.Value.Substring(Fields!MyDateTime.Value.Length-5,2)) * 60

      结果为 480。

    • 下面的表达式将该字符串转换为日期和时间值:=DateTime.Parse(Fields!MyDateTime.Value)

      如果 MyDateTime.Value 字符串具有 UTC 偏移量,则 DateTime.Parse 函数将首先针对 UTC 偏移量进行调整(将上午 7 点- [+08:00] 调整为 UTC 时间的前一天晚上 11 点)。随后,DateTime.Parse 函数将应用本地报表服务器的 UTC 偏移量,如有必要,将针对夏时制再次调整时间。例如,在华盛顿州的雷德蒙德(Redmond),针对夏时制调整的本地时间偏移量为 [-07:00],即比晚上 11 点早 7 个小时。结果为以下 DateTime 值:2007-07-06 04:07:07 PM(2007 年 7 月 6 日下午 4:07)。

      有关将字符串转换为 DateTime 数据类型的详细信息,请参阅 MSDN 上的 Parsing Date and Time Strings(分析日期和时间字符串)和 Formatting Date and Time for a Specific Culture(针对特定区域性格式化日期和时间)。

  • 向报表数据集添加使用表达式提取部分字符串的新计算字段。有关详细信息,请参阅如何在“报表数据”窗格中添加、编辑或删除字段

  • 将报表数据集查询改为使用 Transact-SQL 函数分别提取日期和时间值,从而创建单独的列。下面的示例演示如何使用 DatePart 函数添加年度列和已转换为分钟的 UTC 时区列:

    SELECT

    MyDateTime,

    DATEPART(year, MyDateTime) AS Year,

    DATEPART(tz, MyDateTime) AS OffsetinMinutes

    FROM MyDates

    结果集包含三列。第一列是日期和时间,第二列是年度,第三列是以分钟表示的 UTC 偏移量。下面一行显示了示例数据:

    2008-07-01 06:05:07 2008 480

有关 SQL Server 数据库类型的详细信息,请参阅数据类型(数据库引擎)日期和时间数据类型及函数 (Transact-SQL)