基于两个日期在报告上显示图像

时间:2010-03-29 08:05:52

标签: sql-server reporting-services

我正在使用sql server 2005报告服务来生成数据库的报告库。有两列是datetime类型ColumnA和ColumnB。报告将通过比较这两列来在此报告上显示KPI图像。下面是选择图像的表达式

SWITCH(DateDiff("d",Fields!ColumnA.Value,Fields!ColumnB.Value)<0,"kpi_r",
       DateDiff("d",Fields!ColumnA.Value,Fields!ColumnB.Value)>0,"kpi_g",
       DateDiff("d",Fields!ColumnA.Value,Fields!ColumnB.Value)=0,"kpi_y")

对于大多数记录,图像是正确的。只有一个记录,结果很奇怪。 对于此记录

ColumnA = 2010-04-23 08:00:00 ColumnB = 2010-04-22 17:00:00 它会显示kpi_r,显示kpi_y。我在SSMS中检查了DateDiff(d,Fields!ColumnA.Value,Fields!ColumnB.Value)的值,值为-1。为什么显示kpi_y?有没有人以前遇到过这个问题?

最诚挚的问候,

2 个答案:

答案 0 :(得分:1)

不同之处在于SSMS DATEDIFF函数计算两个日期之间的间隔边界,而ReportBuilder计算实际间隔。在SSMS中,如果您跨越午夜,则触发了一天边界,因此在您的示例中,您获得-1。在ReportBuilder中,它会在两个值之间寻找24小时,因此您得到0.如果将ColumnA上的时间更改为“2010-04-23 17:00:00”,您将看到值更改为-1你期待的。为了进行比较,在执行此SWITCH语句时从ColumnA和ColumnB中剥离时间组件可能是有意义的。

答案 1 :(得分:0)

上面的答案很明显。

根据您的偏好,这里有几种方法可以删除日期:

<强> 1。在RS中执行:在开关表达式中使用和表达如dateserial(year(Fields!ColumnA.Value),month(Fields!ColumnA.Value),day(Fields!ColumnA.Value))

<强> 2。在SQL中执行:在查询中使用类似强制转换的表达式(round(cast(ColumnA as float),0,1)作为日期时间)