函数获取查询的日期范围

时间:2014-05-10 05:52:29

标签: sql function date

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

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

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

2 个答案:

答案 0 :(得分:0)

您的表达甚至可以简化:

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

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

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

答案 1 :(得分:0)

;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