SQLServer 2012自定義函數,返回查詢結果

出發點:與數據相關的查詢、統計、分析操作交給數據庫自己完成。前臺訪問的時候,直接調用具體的函數,確保傳的參數準確即可。

/*
  查詢每小時能耗數據
  P_BuildID:樓宇代碼
  P_EnergyCode:能源類型,支持模糊查詢
  P_StartDate:統計起始時間
  P_EndDate:統計結束時間
  用例:SELECT F_HourValue,F_CollectTime FROM EMS.QueryEneryItemHourResult('110108A001','01%','2015-03-23','2015-03-24');
*/
CREATE FUNCTION QueryEneryItemHourResult(@P_BuildID char(10),@P_EnergyCode varchar(5),@P_StartDate datetime,@P_EndDate datetime)
RETURNS @EneryItemHourResult TABLE (F_HourValue numeric(18,4),F_CollectTime datetime) AS 
BEGIN
  WITH C AS(
    SELECT (F_OrigValue-MAX(F_OrigValue) OVER(PARTITION BY OrigValue.F_MeterID ORDER BY F_CollectTime ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)) AS HourValue,
      F_CollectTime,
      F_EnergyItemCode
    FROM EMS.T_OV_MeterOrigValue AS OrigValue
    LEFT JOIN EMS.T_ST_MeterEnergyItemInfo AS MeterEnergy 
    ON  OrigValue.F_MeterID = MeterEnergy.F_MeterID
    WHERE F_BuildID=@P_BuildID 
      AND OrigValue.F_CollectTime BETWEEN @P_StartDate AND @P_EndDate 
      AND DATEPART(MINUTE,F_CollectTime)=0 
      AND F_EnergyItemCode LIKE @P_EnergyCode
  )
  INSERT INTO @EneryItemHourResult
  SELECT SUM(C.HourValue) AS HourValue,C.F_CollectTime
  FROM C
  GROUP BY C.F_CollectTime
  RETURN
END

/*
  查詢昨天每小時能耗數據
  P_BuildID:樓宇代碼
  P_EnergyCode:能源類型,支持模糊查詢
  用例:SELECT F_HourValue,F_CollectTime FROM EMS.QueryYesterdayEneryItemHourResult('110108A001','01%');
*/
CREATE FUNCTION QueryYesterdayEneryItemHourResult(@P_BuildID char(10),@P_EnergyCode varchar(5))
RETURNS @YesterdayEneryItemHourResult TABLE (F_HourValue numeric(18,4),F_CollectTime datetime) AS 

BEGIN
  DECLARE @P_EndDate datetime = CONVERT(varchar(10),GETDATE(),111)
  DECLARE @P_StartDate datetime = CONVERT(varchar(10),DATEADD(DAY,-1,@P_EndDate),111)

  INSERT INTO @YesterdayEneryItemHourResult
  SELECT F_HourValue,F_CollectTime
  FROM EMS.QueryEneryItemHourResult(@P_BuildID,@P_EnergyCode,@P_StartDate,@P_EndDate)
  RETURN
END


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章