我想根据用户提供的开始日期和结束日期参数从数据库中先前保存的传感器数据中绘制图表。我今天显示用户日历图标和默认开始日期(=DateAdd("d",-2,Today())
)和结束日期(=DateAdd("d", 0,Today())
)。
日历图标显示日期为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 :(得分:0)
您的问题可能是您尝试将时间戳与大于VARCHAR的时间戳进行比较
AND (Timestamp > CONVERT(varchar, @ReportParameterStartDate, 121))
AND (Timestamp < CONVERT(varchar, @ReportParameterEndDate, 121))
CONVERT(varchar,...
实际上将值转换为varchar而不是日期。您的参数已经是日期,因此您不需要转换或转换它们。如果Timestamp是DATETIME字段,您应该能够执行以下操作:
AND (Timestamp > @ReportParameterStartDate)
AND (Timestamp < @ReportParameterEndDate)
虽然您的参数不会有小时/分钟/秒,但它仍会在Start参数日期的午夜之后和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 '%'
将匹配字符串的任何部分到传感器名称的字段。