需要在Oracle 11g DB中创建财务年度条目

时间:2012-12-28 07:27:20

标签: sql oracle oracle11g

我需要根据当前或今天在Oracle11g DB中的日期和时间输入财务年度。

假设我们认为今天的日期是2013年4月1日,那么我需要输出01-APR-1331-MAR-14

我们考虑的财政年度要求是从4月(当年)到3月(次年)。

根据当前日期时间......输出情况取决于当前日期时间,该日期时间属于上述期间或持续时间。

另一个例子:如果我们将今天的日期时间定为2012年12月28日,那么输出需要01-APR-1231-MAR-13

请仅使用SQL帮助如何以非常短的格式实现相同的效果。

将下表视为

Create table venky (financialYearFrom DATE NOTNULL, financialYearTo DATE NOTNULL);

2 个答案:

答案 0 :(得分:3)

丑陋的东西:

   SELECT to_date('1-APR-'||(to_char(sysdate,'yyyy')+
                                (case when to_char(sysdate,'mm')>3 
                                 then 0 
                                 else -1 
                                 end))) AS start_date ,
      to_date('31-MAR-'||(to_char(sysdate,'yyyy')+
                                 (case when to_char(sysdate,'mm')>3 
                                  then 1 
                                  else 0 
                                  end))) end_date 
   FROM dual;

如果month > 3然后将一年添加到31-MAR(end_of_period),则将一年减去1-APR(start_of_period)。

更新:更好的东西:

select add_months(trunc(add_months(sysdate,-3),'yyyy'),3) as start_date ,
    add_months(trunc(add_months(sysdate,-3),'yyyy'),15)-1 as end_date 
   from dual

减少3个月将发送到正确的开始年份。截断到年份并添加3个月会使您获得1 APR。结束时间是提前12个月减去一天。

答案 1 :(得分:1)

为此创建用户定义函数,这是SQL SERVER的示例 找到如何在oracle中执行此操作(两者都与语法中的较小差异相同)

CREATE FUNCTION [dbo].[getYear] 
(
    -- Add the parameters for the function here
    @CurDate DATETIME
)
RETURNS VARCHAR(MAX)
AS
BEGIN
    DECLARE @Y int;
    SELECT @Y = CASE WHEN MONTH(@CurDate) <= 3 THEN YEAR(@CurDate) - 1 ELSE YEAR(@CurDate) END;

    RETURN '01-APR-' + LTRIM(STR(@Y)) + ' and 31-MAR-' + LTRIM(STR(@Y+1));
END

并像这样使用

Select dbo.GETYEAR(GETDATE());