2016-06-14 70 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)) 

我从具有多个选择列表框的UI传递选定的传感器的名称(@ReportParameterSensorName)。

+0

您的参数是否为日期类型?只需使用@ReportParameterStartDate和@ ReportParameterEndDate之间的时间戳。 –

+0

是的,它是日期/时间类型,时间戳记在开始和结束之间。我用查询设计器测试了相同的参数,并且没有问题。 – RotatingWheel

+0

如果您的参数和Timestamp列是日期/日期时间类型,则不需要转换类型或套装格式。 –

回答

0

你的问题可能是你正在试图通过一个大于用比较时间戳的VARCHAR

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

CONVERT(varchar,...实际值转换为varchar,而不是一个日期。您的参数已经是一个日期,因此您不需要投射或转换它们。如果时间戳是一个日期时间字段,你就应该能够做一些事情,如:

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 Measurement WHERE(FieldSensorName IN(@ReportParameterSensorName))AND(时间戳> @ReportParameterStartDate)AND(时间戳<@ReportParameterEndDate) – RotatingWheel

+0

您通过@ReportParameterSensorName传递了什么值?这是一个逗号分隔列表或单个值?当数据集被请求时,你确定它有价值吗?另外什么样的数据类型是Timestamp? – Matt

+0

该参数从用户界面(由用户选择)下面的查询工作正常:SELECT时间戳,值,FieldSensorName 从测量 WHERE(FieldSensorName IN(@ReportParameterSensorName))正如你看到我删除了开始和结束时间参数。我的问题是在时间格式,日历图标显示14.6.2016,但数据库有一个像2016-06-06 00:00:59.937格式也我使用默认值的开始时间为= DateAdd(“d”, - 2,今天()),不知道这是否混在一起。 – RotatingWheel