2016-06-14 74 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