【问题标题】:Convert to Postgres function转换为 Postgres 函数
【发布时间】:2014-12-26 05:52:23
【问题描述】:

我正在将我的 SQL 存储过程转换为 Postgres 函数,但它导致其中一个语句出错

错误:“,”或附近的语法错误 第 7 行:CAST(time(0), '00:00' + (h.hour * interval '1Hour... ^

下面是我正在转换的 Postgres 函数和 SQL 存储过程。请告诉我哪里出错了。

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;
	
  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

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    这不是 CAST 在 Postgresql 中的工作方式。见http://www.postgresql.org/docs/9.2/static/sql-createcast.html

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

    如果您不介意使用非标准 :: 表示法,则最容易阅读(恕我直言)。

    【讨论】:

    • CAST('00:00' + (h.hour * interval '1Hour') as timestamp without time zone) AS from_time 这是我修改的方式,对吗?
    • 作为便携式解决方案看起来不错。 (我会让你决定是否需要时间、时间戳等)
    • 现在,代替外部应用,我正在使用左连接 latreal 是 postgres,但它导致错误,其中 s.shift_id = shiftid 下面是我正在写的左连接 LATERAL (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
    • 我不得不承认,我从来没有使用过 LATERAL 连接,只是 LEFT [OUTER]。 (外部是可选的)
    【解决方案2】:

    最后, 将 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;	
      END;
    $BODY$
      LANGUAGE plpgsql VOLATILE

    【讨论】:

      猜你喜欢
      • 2020-03-07
      • 1970-01-01
      • 2021-11-11
      • 2021-05-29
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多