Как исправить #Error при вычислении DateDiff с оператором IIF в SSRS

Я создаю отчет в 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, и оно возвращает пустое значение.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
727
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я считаю, что проблема возникает в условном заявлении. Если 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), ...

Все это действительно хорошие идеи, но я, кажется, все еще получаю эту ошибку. Я попробовал оба метода, добавил OR вместо EndTime, удалил CStr и установил для текстового поля значение по умолчанию.

Kendall I. 28.06.2019 17:02

@КендаллИ. У меня такое чувство, что это может быть проблема с типом данных... Вы уверены, что оба значения являются датами? Возможно, стоит попробовать добавить CDate() к каждому полю в DateDiff, чтобы быть уверенным.

Steve-o169 28.06.2019 17:08

Хороший улов! Я только что проверил, и тип данных для обоих этих полей — 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"))))

Kendall I. 28.06.2019 17:19

@КендаллИ. Это должно работать, но я не уверен, почему вы конвертируете, затем форматируете обратно в строку, а затем снова конвертируете. Является ли поле VARCHAR форматированием БД MM/dd/yyyy? Вы должны просто уметь использовать один CDate. Одна небольшая опечатка, FORMAT в BeginTime должно быть MM/dd/yyyy.

Steve-o169 28.06.2019 17:34

Поле varchar — «ЧЧ:ММ», затем AM или PM. Я думал, что добавил дополнительный шаг в преобразовании, я просто не был уверен. Спасибо, что нашли опечатку!

Kendall I. 28.06.2019 17:38

Может быть, сработает преобразование полей в SQL-запросе, а затем работа с ним?

Kendall I. 28.06.2019 17:44

@КендаллИ. Наверное, это было бы идеально. Вероятно, что-то вроде getdate()+substring([YourColHere], 1, Length([YourColHere]) - 2(or 3?)) приблизит вас. Возможно, потребуется немного поколдовать с AM против PM (например, добавить 12 к любому с PM)

Steve-o169 28.06.2019 17:51

Я исправил это, используя оператор CASE со встроенным DATEDIFF, чтобы пометить пустые значения как NULL, а затем использовал оператор IIF в SSRS, чтобы пометить значения NULL как «TBA».

Kendall I. 02.07.2019 15:11

Другие вопросы по теме