SSRS Получить данные за прошлый год, когда январь - PullRequest
0 голосов
/ 23 октября 2018

В основном, когда отчет запускается, я хотел бы отобразить данные YTD; если , то это январь, поэтому я хочу отобразить весь прошлый год.

Я пытался вставить это в мое утверждение where, используя case или iif.В обоих случаях я получаю одну и ту же ошибку: Сообщение 102, Уровень 15, Состояние 1 ... Неверный синтаксис рядом с «между».

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

Ответы [ 4 ]

0 голосов
/ 23 октября 2018

Как насчет

WHERE 
      submitteddate >=
      IIF(MONTH(GETDATE()) = 1, DATEADD(Year, -1, GETDATE()), '1900-01-01')
      AND submitteddate <= GETDATE();

Или с помощью переменной

DECLARE @FromDate DATEIME = (SELECT IIF(MONTH(GETDATE()) = 1, DATEADD(Year, -1, GETDATE()), '1900-01-01'));

SELECT *
FROM Table
WHERE 
      submitteddate >=
      @FromDate
      AND submitteddate <= GETDATE();
0 голосов
/ 23 октября 2018
....WHERE YEAR(submitteddate) = YEAR(GETDATE()) 
                  - CASE WHEN MONTH(GETDATE()) = 1 THEN 1 ELSE 0 END 
0 голосов
/ 23 октября 2018

Вместо использования выражения CASE в WHERE, которое не является SARGable, вам будет гораздо лучше использовать переменные:

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;

Обратите внимание, что нет необходимости проверять,значение submitteddate равно NULL или нет.NULL = {expression} всегда приведет к «неизвестному», что не соответствует действительности и, следовательно, не будет возвращено в наборе данных.Таким образом, если вам не нужны значения NULL, то предложение IS NOT NULL не имеет смысла в WHERE, например:

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

Вышеприведенное будет возвращать в точности те же строки, что и:

WHERE [Column] = 1;
0 голосов
/ 23 октября 2018

Похоже, связано с использованием браслетов.пожалуйста, попробуйте как ниже:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...