2014-12-26 132 views
0

我將我的SQL存儲過程來Postgres的功能,但它在聲明中的一個產生的誤差轉換爲Postgres的功能

錯誤:在或附近有語法錯誤「」 第7行:CAST(時間( 0),'00:00' +(h.hour *間隔「1小時...... ^

下面是我的Postgres的功能和SQL存儲過程對此我converting.Please告訴我,我得到錯誤

CREATE OR REPLACE FUNCTION shiftwisedata_sp(INOut shift_id bigint,InOut userdate date,OUT shift_name character varying (50),OUT from_time character varying(50),OUT to_time character varying(50),OUT cal bigint) 
 
    RETURNS SETOF record AS 
 
$BODY$ 
 
    BEGIN 
 
return query 
 
SELECT userdate, s.shift_name, 
 
      CAST(time(0), '00:00' + (h.hour * interval '1Hour')) AS from_time, 
 
      CAST(time(0), '00:00' + ((h.hour + 1) * interval '1Hour')) AS to_time, 
 
      COALESCE(r.Readings, 0) AS readings 
 
    FROM shift_wise s 
 
    CROSS JOIN (VALUES(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), 
 
         (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), 
 
         (20), (21), (22), (23)) AS h(hour) 
 
    OUTER APPLY (SELECT SUM(r.param_value) AS Readings 
 
       FROM table_1 r 
 
       WHERE r.timestamp_col >= CAST(userdate as timestamp without time zone) + (h.hour * interval '1Hour') 
 
        AND r.timestamp_col < CAST(userdate as timestamp without time zone) + ((h.hour + 1) * interval '1Hour')) AS r 
 
WHERE s.shift_id = shift_id 
 
AND (s.to_time > s.from_time    AND 
 
     h.hour >= date_part(HOUR, s.from_time) AND 
 
     h.hour < date_part(HOUR, s.to_time) 
 
    OR 
 
     s.to_time < s.from_time AND 
 
     (h.hour >= date_part(HOUR, s.from_time) OR 
 
      h.hour < date_part(HOUR, s.to_time)) 
 
     ) 
 
     ORDER BY s.to_time; 
 
\t 
 
    END; 
 
$BODY$ 
 
    LANGUAGE plpgsql VOLATILE

CREATE PROCEDURE Shiftdata @date date, @shiftid int AS 
 
    SELECT @date, s.Shift_Name, 
 
      convert(time(0), dateadd(HOUR, h.hour, '00:00')) AS from_time, 
 
      convert(time(0), dateadd(HOUR, h.hour + 1, '00:00')) AS to_time, 
 
      coalesce(r.Readings, 0) AS readings 
 
    FROM Shift_Wise s 
 
    CROSS JOIN (VALUES(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), 
 
         (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), 
 
         (20), (21), (22), (23)) AS h(hour) 
 
    OUTER APPLY (SELECT SUM(r.Reading_Col) AS Readings 
 
       FROM Reading r 
 
       WHERE r.Timestamp_Col >= dateadd(HOUR, h.hour, convert(datetime, @date)) 
 
        AND r.Timestamp_Col < dateadd(HOUR, h.hour + 1, convert(datetime, @date))) AS r 
 
WHERE s.Shift_ID = @shiftid 
 
    AND (s.to_time > s.from_time    AND 
 
     h.hour >= datepart(HOUR, s.from_time) AND 
 
     h.hour < datepart(HOUR, s.to_time) 
 
    OR 
 
     s.to_time < s.from_time AND 
 
     (h.hour >= datepart(HOUR, s.from_time) OR 
 
      h.hour < datepart(HOUR, s.to_time)) 
 
     ) 
 
ORDER BY s.to_time

回答

0

那不是怎麼CAST在PostgreSQL工作。見http://www.postgresql.org/docs/9.2/static/sql-createcast.html

('00:00' + (h.hour * interval '1Hour'))::time 

是最容易閱讀(恕我直言)如果你不介意使用非標準::符號。

+0

CAST('00:00' +(h.hour *間隔 '1小時')作爲時間戳沒有時區)AS from_time這是我如何修改是這樣嗎? – Parth

+0

作爲便攜式解決方案,這看起來不錯。 (我會讓你決定,如果你想要一個時間,時間戳等) –

+0

現在,instaed外部申請我使用左連接latreal是postgres,但它導致錯誤在哪裏s.shift_id = shiftid下面是我是什麼寫入左連接寬度(SELECT SUM(r.param_value)AS讀數 FROM table_1 r WHERE r.timestamp_col> = CAST(userdate作爲沒有時區的時間戳)+ h.hour * interval'1Hour' AND r.timestamp_col Parth

0

最後, 轉換SQL SP向Postgres功能,並獲得所需的結果

CREATE OR REPLACE FUNCTION shiftwisedata_sp(IN shiftid bigint, INOUT userdate date, OUT shift_name character varying, OUT from_time time without time zone, OUT to_time time without time zone, OUT readings bigint) 
 
    RETURNS SETOF record AS 
 
$BODY$ 
 
    BEGIN 
 
    return query 
 
SELECT userdate, s.shift_name, 
 
      ('00:00' + (h.hour * interval '1Hour'):: time) AS from_time, 
 
      ('00:00' + ((h.hour + 1) * interval '1Hour'):: time) AS to_time, 
 
      COALESCE(r.Readings, 0) AS readings 
 
    FROM shift_wise s 
 
    CROSS JOIN (VALUES(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), 
 
         (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), 
 
         (20), (21), (22), (23)) AS h(hour) 
 
    LEFT JOIN LATERAL (SELECT CAST(SUM(r.param_value) as bigint) AS Readings 
 
       FROM table_1 r 
 
       WHERE r.timestamp_col >= (CASt(userdate As timestamp without time zone) + h.hour * interval '1Hour') 
 
        AND r.timestamp_col < (CASt(userdate As timestamp without time zone) + (h.hour + 1) * interval '1Hour') 
 
        ) AS r ON TRUE 
 
WHERE s.shift_id = shiftid 
 
AND (s.to_time > s.from_time    AND 
 
     h.hour >= Extract(HOUR from CAST(s.from_time as time)) AND 
 
     h.hour < Extract(HOUR from CAST(s.to_time as time)) 
 
    OR 
 
     s.to_time < s.from_time AND 
 
     (h.hour >= Extract(HOUR from CAST(s.from_time as time)) OR 
 
      h.hour < Extract(HOUR from CAST(s.to_time as time)) 
 
     )) 
 
     ORDER BY s.to_time; \t 
 
    END; 
 
$BODY$ 
 
    LANGUAGE plpgsql VOLATILE