Как создать функцию, которая будет извлекать год, основываясь на определенной логике - PullRequest
1 голос
/ 10 апреля 2019

Мне нужно создать функцию в DB2, которая будет извлекать год из текущей даты, основываясь на определенной логике

  • Если номер месяца текущей даты меньше и равен 6(= любой месяц до июня), тогда предыдущий год является «базовым годом»
  • Иначе, если номер месяца текущей даты больше 6 (= любой месяц после июня!), то текущийгод является «базовым годом».

Примеры:

  • Базисным годом для даты «9/9/2019» является 2018, так как 4 <= 6 </li>
  • Базовым годом для даты «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

Ответы [ 3 ]

1 голос
/ 10 апреля 2019

Вот один из способов сделать это в 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
0 голосов
/ 11 апреля 2019

Я бы сделал это так

CREATE FUNCTION getReferenceYear()  
RETURNS SMALLINT
RETURN YEAR(CURRENT DATE) - CASE WHEN MONTH(CURRENT DATE) <= 6 then 1 ELSE 0 END
0 голосов
/ 10 апреля 2019
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
...