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

Posted

技术标签:

【中文标题】如何根据一定的逻辑创建一个检索年份的函数【英文标题】:How to create a function which will retrieve year, based on a certain logic 【发布时间】:2019-04-10 07:48:51 【问题描述】:

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

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

例子:

日期“4/9/2019”的参考年份是 2018 年,因为 4 日期“9/3/2019”的参考年是 2019 年,因为 9 > 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;

我在 db2 中也需要。

以下是我尝试过的

CREATE FUNCTION dbo.getReferenceYear()  
 RETURNS INT
 BEGIN ATOMIC

 DECLARE _month INT;
 DECLARE _year INT;

  SET _month = SELECT MONTH (current timestamp)  FROM sysibm.sysdummy1 

  if(_month<=6)
  SET _year = (SELECT YEAR (current timestamp)  FROM sysibm.sysdummy1) -1
  ELSE
  SET _year = (SELECT YEAR (current timestamp)  FROM sysibm.sysdummy1)

 RETURN _year
END

【问题讨论】:

问题是什么? 能不能在db2中用上面的逻辑写一个udf? @data_henrik,你能帮帮我吗 旁注:CURRENT TIMESTAMP 可能每次调用时都会产生不同的值(取决于几件事)。您最好使用存储值,否则这样的查询结果可能是错误的。 【参考方案1】:

这是在 Db2-LUW 中执行的一种方法:

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

【讨论】:

我收到function sequence error的错误 @mao...还有其他选择吗? 什么操作系统运行您的 Db2-SERVER(z/os、i-series、linux/unix/windows),以及您的 Db2 是什么版本? 替换or replace后,就可以正常执行了。现在,你能帮我如何在 db2 上验证它吗???【参考方案2】:
CREATE FUNCTION dbo.getReferenceYear()  
 RETURNS INT
 as
 BEGIN     
 DECLARE @month INT,@year INT;    
  SET @month = SELECT MONTH (ColumnName)  FROM TableName    
  if(_month<=6)
  SET @year = (SELECT YEAR (ColumnName)  FROM TableName -1)
  ELSE
  SET @year = (SELECT YEAR (ColumnName)  FROM TableName)    
 RETURN @year
END

或者,如果您没有任何日期列,并且您想对当前日期应用相同的逻辑,那么-

 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

【讨论】:

我希望它在 db2 中,而不是在 sql server 中 你能在db2中提供这个udf吗【参考方案3】:

我会这样做

CREATE FUNCTION getReferenceYear()  
RETURNS SMALLINT
RETURN YEAR(CURRENT DATE) - CASE WHEN MONTH(CURRENT DATE) <= 6 then 1 ELSE 0 END

【讨论】:

以上是关于如何根据一定的逻辑创建一个检索年份的函数的主要内容,如果未能解决你的问题,请参考以下文章

关于使用python脚本将同级的其他目录下的所有文件根据年份移动到当脚本位置的年份目录

使用 PHP,如何检索与创建的月份和年份匹配的项目

仅根据月份和年份选择 mySQL

Python对列表排序函数sort()和reverse()的讲解

(电工电子)一题一练:根据逻辑函数式画逻辑图

数字电路第四章 逻辑电路4-5节知识点