如何将此T-SQL代码转换为PostgreSQL/plpgsql
我需要将以下tsql函数代码转换为plpgsql函数,我完全不知道如何转换:如何将此T-SQL代码转换为PostgreSQL/plpgsql,sql,tsql,postgresql,datetime,plpgsql,Sql,Tsql,Postgresql,Datetime,Plpgsql,我需要将以下tsql函数代码转换为plpgsql函数,我完全不知道如何转换: BEGIN DECLARE @StartDate DATETIME DECLARE @ResultDate DATETIME SET @StartDate = CONVERT(DATETIME, 0) SET @ResultDate = CASE @Type WHEN 0 THEN DATEADD(mi, FLOOR(DATEDIFF(mi, @StartD
BEGIN
DECLARE @StartDate DATETIME
DECLARE @ResultDate DATETIME
SET @StartDate = CONVERT(DATETIME, 0)
SET @ResultDate =
CASE @Type
WHEN 0 THEN DATEADD(mi, FLOOR(DATEDIFF(mi, @StartDate, @Date) / CAST(@Interval AS FLOAT)) * @Interval, @StartDate)
WHEN 1 THEN DATEADD(mi, CEILING(DATEDIFF(mi, @StartDate, @Date) / CAST(@Interval AS FLOAT)) * @Interval, @StartDate)
ELSE @Date
END
RETURN @ResultDate
全文如下:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[GetIntervalDate]
(
@Date DATETIME,
@Type INT,
@Interval INT
)
RETURNS DATETIME
AS
BEGIN
DECLARE @StartDate DATETIME
DECLARE @ResultDate DATETIME
SET @StartDate = CONVERT(DATETIME, 0)
SET @ResultDate =
CASE @Type
WHEN 0 THEN DATEADD(mi, FLOOR(DATEDIFF(mi, @StartDate, @Date) / CAST(@Interval AS FLOAT)) * @Interval, @StartDate)
WHEN 1 THEN DATEADD(mi, CEILING(DATEDIFF(mi, @StartDate, @Date) / CAST(@Interval AS FLOAT)) * @Interval, @StartDate)
ELSE @Date
END
RETURN @ResultDate
END
明白了:
CREATE FUNCTION get_interval_date("@Date" timestamp, "@Type" int, "@Interval" int)
RETURNS timestamp with time zone AS
$BODY$
DECLARE
_mystamp timestamp;
_round_secs decimal;
BEGIN
_round_secs := "@Interval"::decimal;
IF "@Type" = 0 THEN
RETURN timestamptz 'epoch'
+ FLOOR((EXTRACT(EPOCH FROM "@Date"))::int / _round_secs) * _round_secs * INTERVAL '1 second';
ELSIF "@Type" = 1 THEN
RETURN timestamptz 'epoch'
+ CEIL((EXTRACT(EPOCH FROM "@Date"))::int / _round_secs) * _round_secs * INTERVAL '1 second';
ELSE
RETURN "@Date";
END IF;
END;
$BODY$ LANGUAGE 'plpgsql' IMMUTABLE;
也许其他人需要这样的东西。明白了:
CREATE FUNCTION get_interval_date("@Date" timestamp, "@Type" int, "@Interval" int)
RETURNS timestamp with time zone AS
$BODY$
DECLARE
_mystamp timestamp;
_round_secs decimal;
BEGIN
_round_secs := "@Interval"::decimal;
IF "@Type" = 0 THEN
RETURN timestamptz 'epoch'
+ FLOOR((EXTRACT(EPOCH FROM "@Date"))::int / _round_secs) * _round_secs * INTERVAL '1 second';
ELSIF "@Type" = 1 THEN
RETURN timestamptz 'epoch'
+ CEIL((EXTRACT(EPOCH FROM "@Date"))::int / _round_secs) * _round_secs * INTERVAL '1 second';
ELSE
RETURN "@Date";
END IF;
END;
$BODY$ LANGUAGE 'plpgsql' IMMUTABLE;
也许其他任何人都需要这样的功能。我将您的功能翻译为现代“本机”plpgsql: 要点
- 映射到,而不是带有时区的时间戳
- 使用小写而不是带引号的混合大小写T-SQL样式参数语法
- 删除将_interval转换为十进制的无意义转换(不会更改结果)
- 删除未使用的
\u mystamp
- 因此,请删除未使用的
声明
- 如果,请使用更合适的,而不是
- 切勿引用语言名称
。它是一个标识符,不是字符串;暂时可以容忍,但可能会导致问题plpgsql
- 映射到,而不是带有时区的时间戳
- 使用小写而不是带引号的混合大小写T-SQL样式参数语法
- 删除将_interval转换为十进制的无意义转换(不会更改结果)
- 删除未使用的
\u mystamp
- 因此,请删除未使用的
声明
- 如果,请使用更合适的,而不是
- 切勿引用语言名称
。它是一个标识符,不是字符串;暂时可以容忍,但可能会导致问题plpgsql