SSRS — вычесть 60 дней из сегодняшнего дня и преобразовать в Long

У меня есть отчет SSRS, который запрашивает AS400. Запрос принимает 2 параметра, start_date и end_date. Итак, отчет имеет два текстовых параметра type.

Я пытаюсь взять сегодняшнюю дату (используя функцию Today()), сделать DateDiff из 60 дней и использовать это значение как значение по умолчанию.

Вот осложнения:

  1. Мои параметры Start_Date и End_Date в наборе данных являются переменными типа integer, а не DateTime.
  2. Это означает, что я не могу сделать DateAdd("d", -60, Today()). Потому что тогда этот параметр считается параметром даты, а не целочисленным параметром. Передача этого значения в запрос невозможна.
  3. Я не могу изменить тип данных параметров на Date. Опять же, запрос ожидает целочисленное значение. Это отправка значения даты (с / и всем остальным).
  4. Я не могу указать параметр в запросе, потому что параметры AS400 - это БОЛЕЗНЬ для передачи. Так что прямо сейчас параметр ?. В запросе 6 параметров, и они расположены в том же порядке, что и в отчете. Я не знаю, как CAST или CONVERT будут работать на ?.
  5. Поля Start_Date и End_Date имеют следующий формат: YYYYMMDD

Вот что я думал сделать:

  1. Я думал сделать CAST для сегодняшнего года, сегодняшнего месяца и сегодняшней даты до STR, а затем соединить их все.
  2. А затем CAST, STR до INT и прибавляя -60.

Но если я это сделаю, у меня останется совершенно случайное число. Это может быть что угодно. Например, сегодняшняя дата минус 60 дней будет 20170650, что, очевидно, не является допустимой датой.

Как мне это сделать? Могу ли я получить сегодняшнюю дату, добавить -60 дней, а затем преобразовать ее в целое число? Когда я пытаюсь это сделать, при запуске отчета я получаю серое пустое текстовое поле параметра. Я думал, что это сработает, я не знаю, почему это не так.

Мы ценим любые предложения.

TL;DR:
Как сделать DateAdd из -60 дней до сегодняшней даты, преобразовать его в формат ГГГГММДД и передать в запрос как Integer?


person Crazy Cucumber    schedule 10.07.2017    source источник
comment
CAST/CONVERT работает нормально - вопросительный знак является маркером параметра, который во время оценки заменяется соответствующими данными. Если вы что-то передаете в запрос (DB2 или любую СУБД), вы должны использовать их, иначе станете жертвой внедрения SQL.   -  person Clockwork-Muse    schedule 11.07.2017
comment
Да, но когда я делаю это с SQL Server, я обычно создаю переменную и использую ее в качестве параметра. В DB2 такой возможности нет.   -  person Crazy Cucumber    schedule 11.07.2017
comment
Не имеет значения; даже ваши переменные SQL Server являются маркерами параметров, просто более удобными (и некоторые драйверы для DB2 действительно разрешают использовать именованные маркеры параметров).   -  person Clockwork-Muse    schedule 11.07.2017
comment
Это очень полезно, спасибо. Меня очень пугал вопросительный знак. Попробую немного повозиться. Это может облегчить мне все это дело.   -  person Crazy Cucumber    schedule 11.07.2017


Ответы (3)


Все это делается с помощью функций SSRS. Возможно, было бы проще и/или чище написать для этого функцию в вашем отчете, но я оставлю это на ваше усмотрение.

Это берет текущую дату, делает DATEADD минус 60 дней и выбирает год, месяц и день из результата. Он умножает год на 10000, месяц на 100 и прибавляет день. Вы получите целое число в формате ГГГММДД

Вот выражение (для ясности разбито на несколько строк)

=
(YEAR(dateadd(DateInterval.Day, -60, now())) * 10000) 
+ (Month(dateadd(DateInterval.Day, -60, now())) *100) 
+ day(dateadd(DateInterval.Day, -60, now()))
person Alan Schofield    schedule 10.07.2017
comment
Это похоже на то, как я хотел бы пойти, я попробую и дам вам знать, если это сработает. Спасибо. - person Crazy Cucumber; 11.07.2017
comment
Можете ли вы назвать какие-либо причины, по которым весь раздел параметров исчезает, когда я добавляю ваш запрос в качестве значения параметра по умолчанию? Я имею в виду, что сверху есть раздел с кнопкой «Просмотреть отчет», но он не показывает мне никаких параметров. - person Crazy Cucumber; 11.07.2017
comment
stackoverflow.com/questions/2541456 / - ВАУ! Это, по-видимому, особенность SSRS. Я предпочитаю термин BUG. - person Crazy Cucumber; 11.07.2017
comment
Я только что проверил это. Я создал пустой отчет, добавил один параметр, установил целочисленный тип и установил выражение значения по умолчанию, чтобы оно было точным кодом выше. Когда я запускаю отчет. Параметр появился, как и ожидалось, с правильным значением. Я не уверен, почему вы не видите того же. Попробуйте создать новый отчет, как это сделал я, чтобы посмотреть, сможете ли вы воспроизвести его. - person Alan Schofield; 11.07.2017
comment
Это произошло потому, что у меня было более одного параметра, а параметры по умолчанию для значения даты находятся на 3-й и 4-й позициях. Если есть параметр, отличный от значения по умолчанию, ПЕРЕД параметром по умолчанию, службы SSRS ожидают, что вы введете значение для параметра, отличного от значения по умолчанию, перед заполнением значения по умолчанию. Это такой глупый выбор дизайна Microsoft. - person Crazy Cucumber; 12.07.2017
comment
Вау, я пишу отчеты в SSRS уже много лет, и довольно сложные, но я никогда не сталкивался с этим, или, может быть, мне повезло несколько сотен раз :) - person Alan Schofield; 12.07.2017

Вы можете сделать:

select cast(replace(char(current_date - 60 day, ISO),'-','')as integer) from *your_table*

Как вы можете видеть, формат является целым числом, и вы получаете: ггггММдд, вы можете после сокращения или добавить то, что хотите.

person Cass    schedule 11.07.2017

SQL способ сделать это будет

   year(current_date - 60 days) * 10000
    + month(current_date - 60 days) * 100  
    +   day(current_date - 60 days)        

Лично я предпочитаю иметь только функцию преобразования, которая принимает дату и возвращает числовое представление.

select * 
from mytable
where trndte 
  between ConvertToDte(current_date - 60 days)
      and ConvertToDte(current_date)

Обычно я использую инструмент Alan Campin - IDATE - iSeries Date Conversion, который представляет собой набор UDF конвертирует между типами данных даты и числовыми или символьными.

person Charles    schedule 10.07.2017
comment
Ответ Алана делает то, что вы только что сказали о SSRS, и я, вероятно, соглашусь с этим. Спасибо. - person Crazy Cucumber; 11.07.2017