0

我需要基于 Oracle11g DB 中当前或今天的日期和时间的财政年度条目。

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

我们考虑的要求财政年度是从四月(当年)到三月(下一年)。

基于当前日期时间...输出方案取决于当前日期时间,该日期时间属于上述期间或持续时间。

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

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

将下表视为

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

2 回答 2

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;

如果然后向(end_of_period)month > 3添加一年,否则从 (start_of_period) 减去一年。31-MAR1-APR

更新:更好的东西:

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。End_of 期间是开始前 12 个月减去一天。

于 2012-12-28T07:51:19.747 回答
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());
于 2012-12-28T08:00:47.997 回答