SSRS 不包含日期;而管理工作室是?

SSRS not inclusive for dates; While Management Studio is?

为什么当我 运行 使用以下 where 子句在 Management Studio 中查询时,当 cash_date 等于参数 FromDate 时,它​​ returns 数据正确。

 FILMTRAN.cash_date >= (@FromDate) AND

但是,当我将相同的查询复制到 SSRS 时,它不再包含 @FromDate 等于 cash_date 的数据。用户在 SSRS 中输入参数。我什至做了一个测试,显示了包括时间在内的完整日期,并做了一个 if 语句,如果它们匹配则返回 "yay" ,如果不匹配则返回 "no" 。即使根据 SSRS,它们是匹配的,但为什么我的数据在同一天发生时没有返回?!当它在管理工作室中显然有效时,我很惊讶这是行不通的。

我什至尝试在我的 sql 语句中添加一个 dateadd 函数,它再次在 management studio 中正确响应,但在 ssrs 中没有响应。

编辑:我使用更简单的 3 行查询测试了 >=,它按预期工作,但它仍然不适用于我的查询,它在 management studio 中有效,但在 SSRS 中无效。所以现在我在想有一些非常具体的错误与我附加的较长查询中的某些内容相关联。为了在管理工作室中测试我的代码,我声明了如下所示的变量。但是,当我将查询导入 SSRS 并在 SSRS 中创建参数时,我删除了这段代码(就像我一直做的那样,没有问题)。

DECLARE @FromDate AS DATETIME
SET @FromDate = '1-Oct-2013'
DECLARE @ToDate AS DATETIME
SET @ToDate = '8-Apr-2015'
DECLARE @Loan AS VARCHAR(20)
SET @Loan = 'TAX_B'

SELECT distinct LOANMAST.loan, 
CARDINDX.DESCRIPTION AS BorrowerName, 
CARDINDX.contact_name,
CARDINDX.in_care_of,
--loan_ipt.interest,
CARDINDX.mail_address1, 
CARDINDX.mail_address2,
CARDINDX.mail_city, 
CARDINDX.mail_state,
CARDINDX.mail_country,
LOANMAST.closed_date,
PROPERTY.STATE,
CARDINDX.MAIL_ZIP_CODE, 
PROPERTY.address1, 
PROPERTY.address2,
PROPERTY.city, 
PROPERTY.ZIPCODE, 
PROPERTY.country,
FILMTRAN.cash_date, 
CASE FILMTRAN.TRAN_SUBTYPE WHEN 'REGINST' THEN 'Regular Collections'
WHEN 'PAC' THEN 'PAC'
WHEN 'CORREST' THEN 'Group Collection'
WHEN 'ESCROWTAX' THEN 'Tax Disbursement'
WHEN 'SUNDRY' THEN 'Tax Refund'
WHEN 'FULL PAY' THEN 'Payoff'
END AS TRANSUBTYPE,
FILMTRAN.TAX_ESCROW,
FILMTRAN.TRANSACTION079,
JK.taxescrowbalance,
CASE FILMTRAN.TRANSACTION079 WHEN 'COLLECTION' THEN FILMTRAN.TAX_ESCROW
WHEN 'DISBURSEMENT' THEN 0 
END AS TAXESCROWCOLL,
CASE FILMTRAN.TRANSACTION079 WHEN 'DISBURSEMENT' THEN FILMTRAN.TAX_ESCROW *-1
WHEN 'COLLECTION' THEN 0 
END AS TAXESCROWDIS

FROM LOANMAST LEFT OUTER JOIN BORROWER ON LOANMAST.loan=BORROWER.loan
 LEFT OUTER JOIN LOANCOLL ON LOANMAST.loan=LOANCOLL.loan
 LEFT OUTER JOIN PROPERTY ON LOANCOLL.code=PROPERTY.prop_code
 LEFT OUTER JOIN BALHIST ON BALHIST.loan=LOANMAST.loan
 LEFT OUTER JOIN CARDINDX ON BORROWER.SHORT_NAME=CARDINDX.SHORT_NAME
 LEFT OUTER JOIN LOAN_IPT ON LOAN_IPT.short_name=CARDINDX.short_name
 LEFT OUTER JOIN FILMTRAN ON FILMTRAN.loan=LOANMAST.loan 
JOIN (
 SELECT distinct FILMTRAN.loan, FILMTRAN.cash_date,  FILMTRAN.transaction079 ,FILMTRAN.tax_escrow,
sum(FT.taxescrowcoll)+sum(FT.taxescrowdis)+isnull(BH.esc_tax_bal_p, 0) AS "TaxEscrowBalance" 
from 
FILMTRAN
LEFT OUTER JOIN (SELECT loan, accounting_date, esc_tax_bal_p,
rank () over (order by accounting_date desc) AS date_rank
 FROM BALHIST
 where loan = @Loan) BH ON BH.loan=FILMTRAN.loan
JOIN 
(
SELECT loan, cash_date, 
FILMTRAN.transaction079,
CASE FILMTRAN.TRANSACTION079 WHEN 'COLLECTION' THEN TAX_ESCROW
WHEN 'DISBURSEMENT' THEN 0 
END AS TAXESCROWCOLL,
CASE FILMTRAN.TRANSACTION079 WHEN 'DISBURSEMENT' THEN TAX_ESCROW *-1
WHEN 'COLLECTION' THEN 0 
END AS TAXESCROWDIS FROM FILMTRAN
WHERE loan = @Loan)
FT ON FT.loan=FILMTRAN.loan
where FT.cash_date <= FILMTRAN.cash_date 
AND (BH.date_rank ='1' OR BH.accounting_date IS NULL)
AND (len(FT.transaction079) <= len(FILMTRAN.transaction079) OR FT.cash_date < FILMTRAN.cash_date)
GROUP BY FILMTRAN.loan,FILMTRAN.cash_date,  FILMTRAN.transaction079, FILMTRAN.TAX_ESCROW, BH.esc_tax_bal_p) JK ON JK.loan=FILMTRAN.loan AND JK.cash_date = FILMTRAN.cash_date AND JK.transaction079=FILMTRAN.transaction079

WHERE 
FILMTRAN.RVRS_REASON <> 'ERROR_CORR' AND
Loancoll.prim_ind = 'Y' AND
LOANMAST.loan_status <> '1_INQUIRY' AND
LOANMAST.loan_status <> '2_APP_ISS' AND
LOANMAST.loan_status <> '3_APP_ACC' AND
LOANMAST.loan_status <> '4_APPROVED' AND
LOANMAST.loan_status <> '5_COMMITTED' AND
LOANMAST.loan_status <> '9_DELN_SLF' AND
LOANMAST.loan_status <> '9_REJ_BRWR' AND
FILMTRAN.cash_date >= (@FromDate)
AND FILMTRAN.cash_date <= (@ToDate)
AND LOANMAST.loan = @Loan
AND FILMTRAN.tax_escrow <> 0

您遇到了日期格式问题。

希望您正在调用存储过程来生成数据集。 如果不是,你应该是!

要查看发生了什么,您可能希望将传递的日期输出到 table - 然后在 运行 之后查看 table报告。显然,一旦调试完成,您将删除此 table。 确保将此 table 中的日期存储为文本而不是 DateTime。 看看你从 SSRS 和 Management Studio 运行 时的差异。

我无法重现这个问题。在我的系统中,使用 SSRS-2008,SSRS 中的结果与 SQl-Server 中的结果相同。我正在使用带有 SSRS 参数和 >= 运算符的 where 子句。我测试了 Text 和 Date/Time 参数类型,两者都工作正常。

我建议您确保数据源与您在 SQL 服务器中查询的相同。另外,如果您在参数中输入时间,请尝试输入不带时间的日期。

如需进一步帮助,请post您的完整查询(或传真)以及有关您的 table 和 SSRS 参数设置的信息。

编辑: 看看你在这里的查询,我觉得这可能是问题所在:

where FT.cash_date <= FILMTRAN.cash_date
AND (BH.date_rank ='1' OR BH.accounting_date IS NULL)
AND (len(FT.transaction079) <= len(FILMTRAN.transaction079) OR FT.cash_date < FILMTRAN.cash_date)

可能是因为在主查询中已经包含了 Filmtran 而没有在子查询中使用别名的混淆?我会 运行 在 From 子句中不带两个子查询的查询,看看日期是否如您所料,逐一添加回子查询以确定问题的位置。

好吧,我的问题的解决方案比我承认的要笨。因此,除了说明我的解决方案外,我还将建议与 SSRS/Management Studio 中的日期相关的潜在 problems/solutions:

  1. 检查 SSRS 中数据集的过滤器!这是我的问题,因为我使用的报告模板在数据集上已有过滤器,尽管我通常在 SQL 管理工作室中手动完成所有过滤器。 (见下图)

  2. 确保时间正确,而不仅仅是日期。例如,可能会显示 10/1/2013,但该日期后面的实际值类似于 10/1/2013 5:43 PM。因此,如果您尝试包含在 10/1/2013 5:43 PM 之后但在 10/2/2013 之前发生的值,那么 <= 将不起作用。

  3. 确保 SSRS 和 SQL 服务器的区域日期设置相同。例如,如果一台机器以 DD/MM/YYYY 的欧洲格式查看日期,那么如果另一用户的机器期望日期为 MM/DD/YYYY 格式,则可能会导致问题。