【问题标题】:Need to create Financial Year entries in Oracle 11g DB需要在 Oracle 11g DB 中创建财政年度条目
【发布时间】:2012-12-28 07:27:20
【问题描述】:

我需要基于 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);

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    丑陋的东西:

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

    【讨论】:

    • :太酷了!!!!!!万分感谢 !!!!但这可以简化吗?因为我将在子查询中使用它。
    • 我添加了另一个解决方案。
    • 伙计们......如果你觉得这个问题是真实的,那么请投票给这个问题......谢谢!!!
    【解决方案2】:

    为此创建用户定义函数,这里是 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());
    

    【讨论】:

    • 这个想法很好,但是:1)用户想要纯sql(虽然deterministic函数我确定没问题)。 2)如果我在 sql server 问题上编写 PL/SQL,几乎可以肯定我会得到“拳头”:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    相关资源
    最近更新 更多