Мне нужно создать функцию в DB2, которая будет получать год с текущей даты на основе определенной логики.
Примеры:
Ниже приведен пример реализации для 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
Можете ли вы написать udf с приведенной выше логикой в db2?
@data_henrik, не могли бы вы мне помочь?
Примечание: CURRENT TIMESTAMP
мая дает другое значение при каждом вызове (зависит от нескольких вещей). Вам лучше работать с сохраненным значением, иначе результаты такого запроса могут быть неправильными.
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
не могли бы вы предоставить этот udf в db2
Вот один из способов сделать это в 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 ???
я бы сделал вот так
CREATE FUNCTION getReferenceYear()
RETURNS SMALLINT
RETURN YEAR(CURRENT DATE) - CASE WHEN MONTH(CURRENT DATE) <= 6 then 1 ELSE 0 END
В чем вопрос?