Db2 如何根据一定的逻辑创建检索年份的函数

Db2 如何根据一定的逻辑创建检索年份的函数,db2,stored-functions,Db2,Stored Functions,我需要在DB2中创建一个函数,该函数将根据特定逻辑从当前日期检索年份 如果当前日期的月份数小于等于6(=6月之前的任何月份),则上一年为“参考年” 否则,如果当前日期的月份数大于6(=6月之后的任何月份!),则当前年份为“参考年” 示例: 日期“2019年4月9日”的参考年份为2018年,自4月6日起 下面是SQL Server实现的示例: CREATE FUNCTION dbo.getReferenceYear() RETURNS int AS BEGIN

我需要在DB2中创建一个函数,该函数将根据特定逻辑从当前日期检索年份

  • 如果当前日期的月份数小于等于6(=6月之前的任何月份),则上一年为“参考年”
  • 否则,如果当前日期的月份数大于6(=6月之后的任何月份!),则当前年份为“参考年”
示例:

  • 日期“2019年4月9日”的参考年份为2018年,自4月6日起
下面是SQL Server实现的示例:

 CREATE FUNCTION dbo.getReferenceYear()  
 RETURNS int   
 AS   

 BEGIN  
 DECLARE @ret int;  
 SELECT @ret = MONTH(GETDATE())

  IF (@ret <= 6)   
    SET @ret = (YEAR(GETDATE()) -1); 
    Else 
    SET @ret = (YEAR(GETDATE()) ); 
   RETURN @ret;  
 END;
创建函数dbo.getReferenceYear()
返回整数
作为
开始
声明@retint;
选择@ret=MONTH(GETDATE())
IF(@ret
创建函数dbo.getReferenceYear()
返回整数
作为
开始
声明@month INT,@year INT;
SET@month=从TableName中选择月份(ColumnName)

如果(_month这里有一种在DB2LUW中执行的方法:

CREATE or replace FUNCTION dbo.getReferenceYear()  
 RETURNS INT
 BEGIN ATOMIC

  declare v_nowts timestamp default current timestamp;
  declare v_year int;

  set v_year= year(v_nowts);
  if ( month(v_nowts) <= 6 ) THEN
     SET v_year = v_year -1;
  END IF;
  RETURN v_year ;
END
创建或替换函数dbo.getReferenceYear()
返回整数
开始原子化
声明v_nowts timestamp默认当前时间戳;
宣布v_year int;
设置v_year=年份(v_nowts);

如果(月)我会这样做

CREATE FUNCTION getReferenceYear()  
RETURNS SMALLINT
RETURN YEAR(CURRENT DATE) - CASE WHEN MONTH(CURRENT DATE) <= 6 then 1 ELSE 0 END
创建函数getReferenceYear()
返回SMALLINT

返回年份(当前日期)-当月份(当前日期)时的情况问题是什么?您能在db2中使用上述逻辑编写udf吗?@data\u henrik,请您帮助meSide注意:
CURRENT TIMESTAMP
每次调用时可能会产生不同的值(取决于几件事)。您最好使用存储值,否则这样的查询结果可能会出错。我希望在db2中使用它,而不是在sql SERVER中。您可以在db2I中提供此udf吗?我遇到了一个错误,即
函数序列错误
@mao…有其他选择吗?运行db2服务器的操作系统是什么(z/os、I-series、linux/unix/windows),以及您的Db2是什么版本?在替换
或replace
之后,它得到了正确的执行。现在,您可以帮助我如何在Db2上验证它吗???
 CREATE FUNCTION dbo.getReferenceYear()  
  RETURNS INT
  as
  BEGIN 
  DECLARE @month INT,@year INT;
   SET @month =( SELECT MONTH (GETDATE())  )      
   if(@month<=6)
   SET @year = (SELECT YEAR (GETDATE())-1)  
   ELSE
   SET @year = (SELECT YEAR (GETDATE()) )
  RETURN @year
  END
CREATE or replace FUNCTION dbo.getReferenceYear()  
 RETURNS INT
 BEGIN ATOMIC

  declare v_nowts timestamp default current timestamp;
  declare v_year int;

  set v_year= year(v_nowts);
  if ( month(v_nowts) <= 6 ) THEN
     SET v_year = v_year -1;
  END IF;
  RETURN v_year ;
END
CREATE FUNCTION getReferenceYear()  
RETURNS SMALLINT
RETURN YEAR(CURRENT DATE) - CASE WHEN MONTH(CURRENT DATE) <= 6 then 1 ELSE 0 END