2009-08-04 90 views
1

我有一个使用Oracle数据源的SSRS报告。我有一个查询;将日期参数传递给SSRS中的Oracle查询

select * from myTable t where 
t.date between Date '2009-08-01' and Date '2009-08-04' + 1 

此查询在Oracle和SSRS中均有效。当t.date列在08/01/2009和08/04/2009之间时,它从myTable获取所有行。 t.date列的类型是Date()

现在,我希望日期是参数。所以我将查询改为:

select * from myTable t where 
t.date between Date :myDate and Date :myDate + 1 

当我在SSRS中运行此查询时,它会提示我为myDate输入一个值。

我试过2009-08-01,'2009-08-01'都导致oracle sql处理错误:“Missing expression”。

任何想法?

回答

2

如果你坚持有一个参数(:myDate),使用with子句可以使过程更清洁。我不熟悉你的例子中的语法(即'日期'就像在查询中投射一样),下面是一个SQL唯一的实现。

with 
select TRUNC(TO_DATE(:mydate, 'yyyy-mm-dd')) p_date from dual as parameters 
select t.* 
from 
    myTable t, 
    parameters 
where 
    trunc(t.date) between parameters.p_date and parameters.p_date + 1 
0

您是否尝试过在“报告参数”菜单中确保该参数是DateTime类型(默认情况下为字符串)?

+0

使用的语法是字符串变量(即日期*字符串*) – 2009-08-04 22:29:05

+0

这是不正确的。 IIRC使用datetime数据类型不能解决问题。问题是使用两次参数名称。 – ErikE 2010-08-31 00:26:16

1

只因为你使用过:myDate两次并不意味着它们是相同的。它们是占位符,并且由于您有两个占位符,所以需要两个值。

1

这个工作对我使用SSRS:

SELECT t.* 
FROM myTable t 
WHERE t.date between :myDate AND to_date(:myDate + 1) 
0

我也有类似的问题,一个更大的查询,我发现根本搜索和替换例如:使用TO_DATE(:mydate)的mydate足以解决问题 - 然后将同一日期传递给查询中的TO_DATE(:mydate)的每个实例。

如果你想要一个日期范围传递给查询,我会给参数不同的名称,例如:SQL中的StartDate和EndDate,并在报表中具有单独的参数@StartDate和@EndDate。这使得SQL更清晰。