【问题标题】:Add date without exceeding a month添加日期不超过一个月
【发布时间】:2010-09-28 16:45:26
【问题描述】:

我希望有人可以帮助我。

我想将一个月添加到数据库日期,但我想在最后的那些日子里防止两个跳过月份。

例如我可能有:

2009 年 1 月 31 日

我想得到

2009 年 2 月 28 日

而不是

2009 年 3 月 2 日

下一个日期是

2009 年 3 月 28 日

2009 年 6 月 28 日

等等。

oracle中是否有已经执行这种操作的函数?

编辑

是的。我想每个月将所有具有某种状态的记录复制到下一个(因此用户不必每个月再次输入 2,000 行)

我可以手动获取所有记录并更新日期(以命令的方式),但我宁愿让 SQL 完成这项工作。

类似:

insert into the_table 
select f1,f2,f3, f_date + 30 /* sort of ... :S */  from the_Table where date > ? 

但问题出现在最后一天。

在我必须编写这样的代码之前有什么想法吗?

for each record in 
   createObject( record )
   object.date + date blabala
   if( date > 29 and if februrary and the moon and the stars etc etc 9 

end 

update....  et

编辑:2

添加月份就可以了。

现在我只有这个:

insert into my_table
select f1, add_months( f2, 1 ) from my_table where status = etc etc 

感谢您的帮助。

【问题讨论】:

    标签: sql oracle function date math


    【解决方案1】:

    Oracle 有一个内置函数 ADD_MONTHS 可以做到这一点:

    SQL> select add_months(date '2008-01-31',1) from dual;
    
    ADD_MONTHS(
    -----------
    29-FEB-2008
    
    SQL> select add_months(date '2008-02-29',1) from dual;
    
    ADD_MONTHS(
    -----------
    31-MAR-2008
    

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      我刚刚做了: select add_months(TO_DATE('30-DEC-08'), 2) from dual

      得到 2009 年 2 月 28 日

      无需使用 LAST_DAY。如果你走那条路,你可以创建一个函数: 1.约会 2. 将日期更改为每月的第一天。 3. 增加一个月。 4. 将该月的日期更改为 LAST_DAY。

      【讨论】:

        【解决方案4】:

        我认为你必须自己写,我的建议是首先用这种方法评估“每月的最后一天”:

        • 加一个月(不是 30 天,一个月!)
        • 查找每月的第一天(应该很容易)
        • 减去一天

        然后将它与您的“加 x 天”值进行比较,然后选择最低的值(我理解从 1 月 31 日到 2 月 28 日的跳跃背后的逻辑,但我不明白从 28 日的跳跃 - 2 月至 3 月 28 日)

        【讨论】:

          【解决方案5】:

          听起来您想要当前月份加一(12 月有适当的翻转)

          以及该月最后一天和当天的最小值。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-12-19
            • 2014-12-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-21
            相关资源
            最近更新 更多