如何根据一定的逻辑创建一个检索年份的函数
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脚本将同级的其他目录下的所有文件根据年份移动到当脚本位置的年份目录