我有以下代码来在月的第一天和昨天的日期之间提取数据,除非当天是月的第一天,在这种情况下,它将在上个月和昨天的日期之前拉出。问题是代码一直没有工作,本月没有工作。我认为它没有工作,因为它在5月的最后一天(可能是31日)减去1个月,但没有4月31日,所以它可能会在第1天?这是代码。
在Add_months(last_day(sysdate-1)-1)+1
和sysdate-1
之间
只需要在月份和昨天之间总是拉动的代码,除非当前日期是第1天,否则它将拉动上个月和昨天的第1天。
答案 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