【问题标题】:function to get date range for query获取查询日期范围的函数
【发布时间】:2014-06-27 23:03:24
【问题描述】:

我有以下代码可以在每月的第一天和昨天的日期之间提取数据,除非当天是第一天,在这种情况下,它将提取上个月的第一天和昨天的日期。问题是代码一直没有工作,这个月没有工作。我认为它不起作用,因为它需要 5 月的最后一天(5 月 31 日)减去 1 个月,但没有 4 月 31 日,所以它会到 5 月 1 日?这是代码。

Add_months(last_day(sysdate-1)-1)+1sysdate-1 之间

只需要总是在本月 1 日和昨天之间拉取的代码,除非当前日期是 1 日,否则它将拉上一个月的 1 日和昨天的日期。

【问题讨论】:

    标签: sql function date


    【解决方案1】:
    ;WITH rangeCTE AS
    (
        SELECT  Convert(DateTime, '2013-09-01') minDate,
                Convert(DateTime, '2014-06-30') maxDate
    )
    
    ,datelistCTE AS
    (
            SELECT  CAST(CONVERT(CHAR(6),minDate,112) + '01' AS DATETIME) AS monthStart,
                    DATEADD(mm, 1, CAST(CONVERT(CHAR(6), minDate, 112) + '01' AS DATETIME)) -1 AS monthEnd
                   ,1 AS monthID
            FROM rangeCTE
    
            UNION ALL
    
            SELECT  DATEADD(mm, 1, monthStart)
                   ,DATEADD(mm, 2, monthStart) - 1
                   ,monthID + 1
            FROM datelistCTE
            WHERE monthStart <= (SELECT maxDate FROM rangeCTE)
    )
    select * from datelistCTE
    

    【讨论】:

      【解决方案2】:

      你的表达甚至可以简化:

      BETWEEN TRUNC(SYSDATE - 1, 'MM') AND SYSDATE - 1
      

      TRUNC(date, 'MM') 将向下舍入到本月的第一天,并将时间分量设置为 0。清除 昨天 的时间分量可能更清晰。如果没有第二个参数,TRUNC 将向下舍入到一天的开始:

      BETWEEN TRUNC(SYSDATE - 1, 'MM') AND TRUNC(SYSDATE - 1)
      

      【讨论】:

        猜你喜欢
        • 2017-08-05
        • 1970-01-01
        • 2023-04-02
        • 2020-07-28
        • 2019-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多