2016-06-14 7 views
0

Я хочу нарисовать диаграммы из ранее сохраненных данных датчиков из базы данных на основе дат начала и конечной даты, предоставленных пользователем. Я показываю значок календаря пользователя и дату начала по умолчанию (=DateAdd("d",-2,Today())) и дату окончания сегодня (=DateAdd("d", 0,Today())).Форматирование даты Время для SSRS (SQL Server 2008 R2)

Значок календаря показывает дату как 11.6.2016, но в базе данных дата сохраняется как 2016-06-11 00:00:05.217. Если я использую следующий SQL-запрос, ничего не возвращается, но если я использую его в дизайнере запросов Visual Studio, то получаю ожидаемые данные. Какой был бы правильный синтаксис?

SELECT Timestamp, Value, FieldSensorName 
FROM MeasurementTable 
WHERE (FieldSensorName IN (@ReportParameterSensorName)) 
    AND (Timestamp > CONVERT(varchar, @ReportParameterStartDate, 121)) 
    AND (Timestamp < CONVERT(varchar, @ReportParameterEndDate, 121)) 

Я передаю выбранные имена датчиков (@ReportParameterSensorName) из пользовательского интерфейса с несколькими списка выбора коробки.

+0

Являются ли ваши параметры типами даты? Просто используйте 'Timestamp между @ReportParameterStartDate и @ ReportParameterEndDate' –

+0

Да, это тип даты/времени и отметка времени между началом и концом. Я тестировал те же параметры с конструктором запросов, и там все нормально. – RotatingWheel

+0

Если ваши параметры и столбец Timestamp являются типом даты/даты, вам не нужно преобразовывать типы или подходящие форматы. –

ответ

0

Ваша проблема может быть, что вы пытаетесь сравнить Timestamp на большее, чем с VARCHAR

AND (Timestamp > CONVERT(varchar, @ReportParameterStartDate, 121)) 
AND (Timestamp < CONVERT(varchar, @ReportParameterEndDate, 121)) 

CONVERT(varchar,... фактически преобразует значение в VARCHAR, а не даты. Ваши параметры уже являются датой, поэтому вам не нужно их бросать или конвертировать. Если Отметка это поле DATETIME вы просто должны быть в состоянии сделать что-то вроде:

AND (Timestamp > @ReportParameterStartDate) 
AND (Timestamp < @ReportParameterEndDate) 

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

AND (Timestamp < DATEADD(MS,-3,CAST(CAST(@ReportParameterEndDate + 1 AS DATE) AS DATETIME))) 

Есть один способ, который я обычно получаю в конце дня. То, что он делает, это добавить день к дате окончания, чтобы указать дату, чтобы отбросить часы/минуты/секунды, а затем вернуть ее к дате и удалить 3 миллисекунды, чтобы добраться до самой высокой точности в конце дня до округления до полуночи следующего дня, например 2016-06-14 23: 59: 59.997.

(FieldSensorName IN (@ReportParameterSensorName)) 

Может также быть проблемой в зависимости от того, что вы передаете в переменной @ReportParameterSensorName, как это будет рассматриваться как единое буквенное значение. Поэтому, если вы передаете список с разделителями-запятыми или что-то еще, вам нужно найти, как разбить строку на таблицу и использовать объединение, а не список. Если вы не в порядке с некоторым потенциалом для ошибок и просто изменить что-то вроде

@ReportParameterSensorNameLIKE '%' + FieldSensorName '%' 

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

+0

Я пробовал следующее и снова тестировал снова, но результат такой же: SELECT Timestamp, Value, FieldSensorName FROM Измерение WHERE (FieldSensorName IN (@ReportParameterSensorName)) AND (Timestamp> @ReportParameterStartDate) AND (Timestamp <@ReportParameterEndDate) – RotatingWheel

+0

Какое значение вы передаете через @ReportParameterSensorName? Является ли это разделенным запятой списком или единственным значением? Вы уверены, что он имеет значение, когда запрашивается набор данных? Также какой тип данных является Timestamp? – Matt

+0

Этот параметр указана из пользовательского интерфейса (выбран пользователем) После выполнения запроса отлично: SELECT Timestamp, Value, FieldSensorName FROM Measurement WHERE (FieldSensorName IN (@ReportParameterSensorName)) Как вы видите, я удалил начальные и конечные параметры времени. Я проблема в формате времени, значок календаря показывает 14.6.2016, но база данных имеет формат 2016-06-06 00: 00: 59.937 Также я использую значение по умолчанию для времени начала как = DateAdd («d», - 2, сегодня()), не уверен, что это смешение. – RotatingWheel

Смежные вопросы