Я создаю отчет в Reporting Services, чтобы отображать промежутки времени для занятий в классе в нашей программе. Был запрошен один столбец, чтобы показать общее количество часов между временем начала и окончания одного сеанса. Я использовал функцию DATEDIFF, показывающую DateInterval в часах как общее количество часов за один промежуток времени, но я получаю #Error для пустых значений, которым не назначено время начала или окончания.
Я добавил оператор IIF, чтобы пометить пустые значения как «подлежит уточнению», но это не сработало. Поскольку я привожу строку к значению даты и времени, я заключил оператор DATEDIFF в функцию CStr, но это также не работает. Наконец, я сделал простую вещь и установил текстовое поле для отображения числового значения, поскольку оно возвращает общее количество часов, но, конечно, это тоже не сработало. Мой код выглядит следующим образом:
=IIF(Fields!BeginTime.Value = "", "TBA", CStr(DateDiff(DateInterval.Hour, Fields!BeginTime.Value, Fields!EndTime.Value)))
Предполагается, что это значение «TBA» должно отображаться в пустых местах, но я все равно получаю #Error. Однако общее количество часов подходит для значений, которые не являются пустыми. Я проверил значение в наборе данных, чтобы увидеть, возвращает ли оно пустое значение или значение с меткой NULL, и оно возвращает пустое значение.
Я считаю, что проблема возникает в условном заявлении. Если Fields!BeginTime.Value
является типом данных даты, сравнение его с ""
, скорее всего, приведет к ошибке, которую вы получаете. Я предлагаю использовать функцию IsNothing
или просто проверить, не пусто ли поле. Два варианта следующие.
=IIF(IsNothing(Fields!BeginTime.Value), ...
Или...
=IIF(Fields!BeginTime.Value Is Nothing, ...
С учетом сказанного вам не нужно использовать CStr
, поскольку DateDiff
вернет целочисленное значение. Ваше текстовое поле должно быть установлено на Default
или какой-либо вариант текста, чтобы предотвратить ошибки. Выражение вернет либо целое число, либо строку, поэтому формат числа в текстовом поле не будет работать.
Кроме того, если у вас возникла та же проблема, когда нет EndTime
, вы можете добавить OR
к условному выражению, чтобы исправить это.
=IIF(IsNothing(Fields!BeginTime.Value) OR IsNothing(Fields!EndTime.Value), ...
@КендаллИ. У меня такое чувство, что это может быть проблема с типом данных... Вы уверены, что оба значения являются датами? Возможно, стоит попробовать добавить CDate()
к каждому полю в DateDiff
, чтобы быть уверенным.
Хороший улов! Я только что проверил, и тип данных для обоих этих полей — varchar. Итак, я изменил свой код и добавил CDate()
к каждому полю в DateDiff
. Проверить правильность моего кода для этого? IIF(IsNothing(Fields!BeginTime.Value) OR IsNothing(Fields!EndTime.Value), "TBA", DateDiff(DateInterval.Hour, CDate(Format(CDate(Fields!BeginTime.Value),"M/dd/yyyy HH:mm:ss")), CDate(Format(CDate(Fields!EndTime.Value), "MM/dd/yyyy HH:mm:ss"))))
@КендаллИ. Это должно работать, но я не уверен, почему вы конвертируете, затем форматируете обратно в строку, а затем снова конвертируете. Является ли поле VARCHAR
форматированием БД MM/dd/yyyy
? Вы должны просто уметь использовать один CDate
. Одна небольшая опечатка, FORMAT
в BeginTime должно быть MM/dd/yyyy
.
Поле varchar — «ЧЧ:ММ», затем AM или PM. Я думал, что добавил дополнительный шаг в преобразовании, я просто не был уверен. Спасибо, что нашли опечатку!
Может быть, сработает преобразование полей в SQL-запросе, а затем работа с ним?
@КендаллИ. Наверное, это было бы идеально. Вероятно, что-то вроде getdate()+substring([YourColHere], 1, Length([YourColHere]) - 2(or 3?))
приблизит вас. Возможно, потребуется немного поколдовать с AM против PM (например, добавить 12 к любому с PM)
Я исправил это, используя оператор CASE со встроенным DATEDIFF, чтобы пометить пустые значения как NULL, а затем использовал оператор IIF в SSRS, чтобы пометить значения NULL как «TBA».
Все это действительно хорошие идеи, но я, кажется, все еще получаю эту ошибку. Я попробовал оба метода, добавил
OR
вместоEndTime
, удалилCStr
и установил для текстового поля значение по умолчанию.