Формат параметра SSRS DateTime - PullRequest
       77

Формат параметра SSRS DateTime

0 голосов
/ 19 февраля 2020

Мне нужно создать отчет SSRS (2017) с параметрами диапазона дат, BeginDate и EndDate.
Контекст: это отчет для извлечения имен, дат рождения и дат умерших на основе даты смерти, произошедшей между BeginDate и EndDate.

Таблица, в которой я работаю с датами магазинов в формате ГГГГММДД.

Изначально я попробовал простое решение установки параметра в формате DateTime. Это не сработало. Я предполагаю, что это потому, что настройки локального языка помещают формат параметра в MMDDYYYY, поэтому выбор от 02172018 до 10172019 не даст результатов, если все даты в таблице начинаются с 2019 (ммдд).

Я не верю, что настройка языковых настроек не будет полезна в этом случае в долгосрочной перспективе, так как в этом месте будет несколько пользователей, работающих с этим отчетом, так что я думаю, что это не сработает для всех. Я не уполномочен изменять языковые настройки на моем локальном сервере для этой цели, так что это не так.

Если эти предположения не верны, пожалуйста, сообщите.

Итак, я подумал, может быть, если я преобразую даты в основном наборе данных отчета, он все еще может их прочитать, но это тоже не сработало:

CASE WHEN A.birthdate = '00000000'
              THEN ''
            ELSE CASE LEN(A.birthdate)
                 WHEN 8 
                  THEN CONVERT(varchar(10), CAST(A.birthdate AS datetime),21)
                 WHEN 6 
                  THEN CONVERT(varchar(10), SUBSTRING(A.birthdate,1,4)+'/'+SUBSTRING(A.birthdate,5,2),21)
                 WHEN 4 
                  THEN CONVERT(varchar(10), A.birthdate,21)
                 ELSE NULL
                  END
        END AS BirthDate
,CASE WHEN D.DECEASEDDATE = '00000000'
              THEN ''
            ELSE CASE LEN(D.DECEASEDDATE)
                 WHEN 8 
                  THEN CONVERT(varchar(10), CAST(D.DECEASEDDATE AS datetime),21)
                 WHEN 6 
                  THEN CONVERT(varchar(10), SUBSTRING(D.DECEASEDDATE,1,4)+'/'+SUBSTRING(D.DECEASEDDATE,5,2),21)
                 WHEN 4 
                  THEN CONVERT(varchar(10), D.DECEASEDDATE,21)
                 ELSE NULL
                  END
        END AS DeceasedDate

Я получил следующая ошибка:
«Произошла ошибка во время обработки отчета. Не удалось прочитать следующую строку данных для набора данных. Преобразование типа данных varchar в тип данных datetime привело к значению вне допустимого диапазона.»

Что еще можно попробовать, чтобы параметры даты работали?

1 Ответ

0 голосов
/ 19 февраля 2020

Какой тип данных - даты рождения и смерти в базе данных?

Если они являются датой или датой-временем, и вы используете средство выбора даты для параметров своего отчета, вы можете сравнить их, формат, в котором они отображаются, не должен иметь значения, поскольку внутренне они хранятся правильно.

В качестве теста создайте новый отчет, добавьте параметр даты, чтобы отобразился указатель даты. Затем добавьте текстовое поле для отображения отформатированного значения параметра. Используйте формат, который использует такие слова, как «19 февраля 2020», чтобы не было двусмысленности. Если это работает, то у вас не должно быть проблем

Вы, ГДЕ ОГЛАВЛЕНИЕ, просто были бы что-то вроде

WHERE DeceasedDate BETWEEN @BeginDate AND @EndDate

РЕДАКТИРОВАТЬ На основании ответа ОП ..

Пожалуйста, попробуйте следующие тесты и посмотрите, какие результаты вы получите. Предполагая, что вы вернули разумную дату, я бы создал представление с дополнительным столбцом, который преобразует даты в формате char (8) в типы данных реальной даты на основе того отчета, который вы сообщаете в этом представлении.

DECLARE @dt char(8) = '20200201'
SELECT CAST(@dt as date)
SELECT DATEFROMPARTS(LEFT(@dt,4),SUBSTRING(@dt, 5,2),RIGHT(@dt,2))

SELECT FORMAT(CAST(@dt as date), 'dd MMMM yyyy')

Последнее Один из них - убедиться, что дни и месяцы правильно интерпретируются.

DATEFROMPARTS всегда должен работать, когда вы говорите, какие части строки представляют каждую часть даты, но это медленнее, чем первый вариант .

Если предположить, что DATEFROMPARTS работает, ваше представление может выглядеть примерно так:

SELECT *
    , DATEFROMPARTS(LEFT(Deceased,4),SUBSTRING(Deceased, 5,2),RIGHT(Deceased,2)) as DeceasedDateNew
    FROM myTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...