【问题标题】:Oracle sysdate flexible dateOracle sysdate 灵活日期
【发布时间】:2015-09-02 09:03:01
【问题描述】:

我把这句话写出来了

SELECT to_date('30.06.2016', 'dd.mm.yyyy') - (LEVEL-1) DATUM 
        FROM DUAL
        CONNECT BY LEVEL <= 366;

这给了我从30.06.2016 到过去 366 天的所有日期。

到目前为止一切顺利。

我需要补充的是to_date('30.06.2016')更灵活..

我的意思是我总是希望它使用 sysdate + 1 年中 6 月的最后一天。

在这种情况下,我们现在有 2015 - 所以我们有 30.06.2016。

如果我们有 2016 年,我需要它来使用 30.06.2017。 如果我们有 2017 年,我需要它来使用 30.06.2018。 .. ..

感谢您的帮助。

编辑解决方案

SELECT last_day(add_months(to_date('01.06.' || to_char(sysdate, 'YYYY'), 'dd.mm.yyyy'),12)) - (LEVEL-1) DATUM 
        FROM DUAL
        CONNECT BY LEVEL <= 366

【问题讨论】:

  • 连接 '30.06.'与年。您可以通过格式化 sysdate + 365 来获取年份。
  • 我更正了 - 谢谢马
  • 为了正确处理闰年,您应该使用CONNECT BY to_date('30.06.2016', 'dd.mm.yyyy') - (LEVEL-1) &lt;= ADD_MONTHS(to_date('30.06.2016', 'dd.mm.yyyy'), -12) 而不是CONNECT BY LEVEL &lt;= 366;
  • 您的问题不是放置解决方案的地方。

标签: oracle sysdate


【解决方案1】:

如果您想要 366 天的日期:

SELECT TRUNC( SYSDATE, 'YEAR' ) + INTERVAL '18' MONTH - LEVEL AS DATUM
FROM   DUAL
CONNECT BY LEVEL <= 366;

或者,如果您想要一年(闰年 365 天或 366 天)的日期(今年 7 月 1 日至明年 6 月 30 日):

SELECT TRUNC( SYSDATE, 'YEAR' ) + INTERVAL '18' MONTH - LEVEL AS DATUM
FROM   DUAL
CONNECT BY TRUNC( SYSDATE, 'YEAR' ) + INTERVAL '18' MONTH - LEVEL >= TRUNC( SYSDATE, 'YEAR' ) + INTERVAL '6' MONTH;

【讨论】:

    【解决方案2】:

    是你的相同代码,但从 sysdate 获取年份,使用 to_char:

    select to_date('30.06.'||(to_char(sysdate,'yyyy')+1),'dd.mm.yyyy') from dual;
    

    【讨论】:

      【解决方案3】:

      步骤如下:

      1. 使用 Trunc() 将 sysdate 截断为年份。
      2. 使用 Add_Months() 添加 18 个月。
      3. 减去一天。

      【讨论】:

        猜你喜欢
        • 2012-08-17
        • 1970-01-01
        • 2021-12-29
        • 2015-10-06
        • 2012-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多