Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将此T-SQL代码转换为PostgreSQL/plpgsql_Sql_Tsql_Postgresql_Datetime_Plpgsql - Fatal编程技术网

如何将此T-SQL代码转换为PostgreSQL/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

我需要将以下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, @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
    。它是一个标识符,不是字符串;暂时可以容忍,但可能会导致问题


我将您的函数转换为现代“本机”plpgsql:

要点
  • 映射到,而不是带有时区的时间戳

  • 使用小写而不是带引号的混合大小写T-SQL样式参数语法

  • 删除将_interval转换为十进制的无意义转换(不会更改结果)

  • 删除未使用的
    \u mystamp

  • 因此,请删除未使用的
    声明

  • 如果,请使用更合适的,而不是

  • 切勿引用语言名称
    plpgsql
    。它是一个标识符,不是字符串;暂时可以容忍,但可能会导致问题


这似乎是一项功能。函数的名称是什么,函数的@Date、@Interval和@Type参数是什么?查看函数声明会很有帮助。这似乎是一个函数。函数的名称是什么,函数的@Date、@Interval和@Type参数是什么?查看函数声明会很有帮助。您只需要在它周围加上双引号,因为您完成了整个@Uppercase操作。将大小写改为小写,并去掉引号-这是非常正常的plpgsql。您只需要在它周围加上双引号,因为您完成了整个@Uppercase操作。将案例放低并删除引号-这比plpgsql更正常。