【问题标题】:Select first day of preceding month in (DB2) SQL在 (DB2) SQL 中选择上个月的第一天
【发布时间】:2010-11-06 23:36:35
【问题描述】:

对于每月查询,我需要检查给定日期是否在上个月。我可以得到

CURRENT DATE - 1 MONTH

比较选定的日期,但我不能假设当前日期将是每个月的第一天。是否有一种内置方法可以在不提取年份和月份并将其重新粘合在一起的情况下获取该月的第一天?

【问题讨论】:

    标签: sql database date db2


    【解决方案1】:

    今年的第一天:

    date('0001-01-01') + year(current date) years - 1 year
    

    本月的第一天:

    date('0001-01-01') + year(current date) years - 1 year + month(current date) months - 1 month
    

    上个月的第一天:

    date('0001-01-01') + year(current date) years - 1 year + month(current date) months - 2 months
    

    如果您不需要保持 SQL 与 Db2 LUW v10.5 及更早版本的兼容性,您还可以使用这些方便的 Db2 LUW v11.1 标量函数:THIS_WEEK()THIS_MONTH()THIS_QUARTER()THIS_YEAR()

    本月的第一天:

    THIS_MONTH(CURRENT DATE)
    

    上个月的第一天:

    THIS_MONTH(CURRENT DATE) - 1 MONTH
    

    上个月的最后一天:

    THIS_MONTH(CURRENT DATE) - 1 DAY
    

    【讨论】:

    • 很好,这些都相当轻松。谢谢。
    【解决方案2】:

    这是我的 DB2 SQL Month Calculation Cheat Sheet 中的 sn-ps:

    当月月初:

    CURRENT DATE + 1 DAYS - DAY(CURRENT DATE) DAYS
    

    当月月底:

    LAST_DAY(CURRENT DATE)
    

    上个月的开始:

    CURRENT DATE + 1 DAYS - DAY(CURRENT DATE) DAYS - 1 MONTHS
    

    上个月月底:

    LAST_DAY(CURRENT DATE - 1 MONTHS)
    

    下月初:

    CURRENT DATE + 1 DAYS - DAY(CURRENT DATE) DAYS + 1 MONTHS
    

    下月底:

    LAST_DAY(CURRENT DATE + 1 MONTHS)
    

    【讨论】:

      【解决方案3】:

      当月的第一天:

      CURRENT_DATE - (DAY(CURRENT_DATE)-1) DAYS 
      

      当前年份的第一天是

      CURRENT_DATE - (DAY(CURRENT_DATE)-1) DAYS - (MONTH(CURRENT_DATE)-1) MONTHS 
      

      上个月的最后一天:

      CURRENT_DATE - DAY(CURRENT_DATE) DAYS 
      

      上个月的第一天:

      CURRENT_DATE - (DAY(CURRENT_DATE)-1) DAYS - 1 MONTH 
      

      【讨论】:

        【解决方案4】:

        LUW 9.7(我认为是 z/os)方法使用内置函数。

        当月最后一天:

        LAST_DAY(CURRENT DATE)
        

        上个月的第一天:

        LAST_DAY(CURRENT DATE - 2 MONTHS) + 1 DAY or (LUW) TRUNCATE(CURRENT DATE - 1 month, 'MONTH')
        

        当月的第一天:

        LAST_DAY(CURRENT DATE - 1 MONTH) + 1 DAY or (LUW) TRUNCATE(CURRENT DATE, 'MONTH');  
        

        【讨论】:

          【解决方案5】:

          我相信以下内容对您有用。

          ROUND_TIMESTAMP (somedate,'W')
          

          【讨论】:

          • 我没有看到针对 DB2 for Linux、UNIX 和 Windows 平台列出的函数。它可能仅适用于大型机 DB2。
          • 我的错。严格意义上的 z/OS。一家公司如何发布单一产品却没有尽可能跨平台通用的功能,这让我永远感到惊讶。我无法想象这在任何地方都行不通的唯一原因。除此之外,除了您在下面发布的内容或将当前日期分解为字符串块 MONTH、DAY、YEAR,修改 MONTH 和 DAY,然后重建新日期之外,我不知道其他解决方案。
          • 很遗憾,当我查看它时,这看起来确实很完美。
          • 我听到了。 DB2 z/OS 中的一些特性是我们 LUW 人在 DB2 9.7 中几乎没有得到的,而其他一些特性也几乎没有被移植。也就是说,IBM 在协调大型机 DB2 和 DB2 LUW(大型机群有时将其称为“小”DB2)之间的 SQL 和特性方面取得了很大进展。著名的 DB2 发言人(例如 Craig Mullins)的会议会话和用户组演示指出了不断增长的 SQL 集,它们在两种 DB2 产品中的工作方式完全相同。它仍然不完美,但我已经看到了显着的进步。
          • 听到这让我很开心。目前,我正在使用 IBM 的 Maximo 资产管理系统,而 IBM 对它的使用非常糟糕。我的印象是,它主要得到为 IBM 收购它的公司工作的人的支持。它是由那些不将数据库视为(有效地)一系列平面文件的人设计的产品。他们的支持是悲惨的。如果它被纳入 IBM 的主流支持,也许我会很幸运。
          【解决方案6】:

          为了用更多信息充实这一点。如果您想要一个月的第一天,例如您想要一个月的最后一天,或者在我的情况下,我想要下个季度的最后一天,那么上面的解决方案是完美的。

          从上面我在做

          date('0001-01-31') + year(date(prevQdate))years - 1 year + month(prevQdate) months + 2 months)
          

          这并没有给我想要的东西,有时日期是 30 号而不是 31 号几个月,有 31 天...

          改成

          date('0001-01-31') + year(date(prevQdate))years - 1 year + **(month(prevQdate) + 2)** months)
          

          给了我想要的。看起来从上一季度开始添加的月份的第一次添加正在重置我日期的 DAY 部分,因此第二次添加的月份是在该月只有 30 天的日期工作。

          在 DB2 中使用这种日期操作方法时需要注意一些事项。

          【讨论】:

          • 产生一个月最后一天的最可靠方法是构建一个表达式,产生其后一个月的第一天,然后减去一天。下个季度的最后一天,例如 DATE('0001-01-01') + YEAR(CURRENT DATE) YEARS - 1 YEAR + ((QUARTER(CURRENT DATE) +1) * 3) MONTHS - 1 DAY
          猜你喜欢
          • 2010-12-03
          • 2020-07-11
          • 1970-01-01
          • 1970-01-01
          • 2017-03-28
          • 1970-01-01
          • 1970-01-01
          • 2021-10-24
          • 2013-08-27
          相关资源
          最近更新 更多