首页 > 解决方案 > SSRS 从去年 1 月提取数据

问题描述

基本上,当报告运行时,我想显示 YTD 数据;除非,现在是一月份,那么,我想显示去年的所有内容。

我一直试图将它放在我的 where 语句中,使用 case 或 iif。在这两种情况下,我都会收到相同的错误:Msg 102,Level 15,State 1...'between' 附近的语法不正确。

SELECT      
name,
owner,
duedate,
submitteddate   
FROM Table
WHERE submitteddate IS NOT NULL AND
CASE WHEN MONTH(GETDATE()) = 1
THEN submitteddate between  DATEADD(YEAR, DATEDIFF(YEAR, '19000101', GETDATE()) - 1 , '19000101') AND DATEADD(d, -1, DATEADD(YEAR, DATEDIFF(YEAR, '19000101', GETDATE()), '19000101'))))
ELSE submitteddate between DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AND  GETDATE()))
end

标签: sqlsql-servervisual-studio-2010reporting-services

解决方案


与其在 中使用不是 SARGable的CASE表达式,不如使用变量更好:WHERE

DECLARE @StartDate DATE, @EndDate Date;

SET @StartDate = CASE DATEPART(MONTH,GETDATE()) WHEN 1 THEN DATEADD(YEAR, DATEDIFF(YEAR, 0,GETDATE())-1,0)
                                                ELSE DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()),0)
                 END;
SET @EndDate = DATEADD(YEAR,DATEDIFF(YEAR, 0,@StartDate)+1,0);

--SELECT @StartDate, @EndDate; --Uncomment to check the values, but would break SSRS, as it only reads the first returned dataset.

SELECT [name],
       [owner],
       duedate,
       submitteddate   
FROM [Table]
WHERE submitteddate >= @StartDate
  AND submitteddate < @EndDate;

请注意,无需检查 的值是否submitteddateNULLNULL = {expression}将始终导致“未知”,这是不正确的,因此不会在数据集中返回。因此,如果您不想要NULL值,那么该IS NOT NULL子句在类似的情况下是没有意义的WHERE

WHERE [Column] IS NOT NULL
  AND [Column] = 1;

以上将返回与以下完全相同的行:

WHERE [Column] = 1;

推荐阅读