我正在尝试选择所有 12 个月/年。我认为遵循 TSQL 代码可以做到这一点。但是,这并不包括我想要的所有月份。这是什么原因?这是修改后的代码:
DECLARE @END_YEAR VARCHAR(10)
DECLARE @END_MONTH VARCHAR(10)
SET @END_YEAR = '2010'
SET @END_MONTH = '10'
DECLARE @TheMonthLastDate DATETIME
DECLARE @TempDate DATETIME
SET @TempDate = '2010-11-01 00:00:00.000'
SET @TheMonthLastDate = '2010-11-01 00:00:00.000'
;with months
as
(
select dateadd(month, -1, dateadd(day, datediff(day, 0, @TempDate), 0)) as m
union all
select dateadd(month, -1, m)
from months
where m > dateadd(month, -12, @TempDate)
)
,yourTable(DateOpened, DateClosed)
as
(select TSK_START_DATE, BTK_CLOSED_DATE
FROM [PROC].ALL_AUDIT
WHERE
(BTK_CLOSED_DATE < @TheMonthLastDate OR
TSK_START_DATE < @TheMonthLastDate
)
)
select yt.DateClosed 'r2', m.m 'r3',
month(coalesce(yt.DateClosed, m.m)) as 'MonthClosed',
year(coalesce(yt.DateClosed, m.m)) as 'YearClosed'
from months m
left join yourTable yt
on
( datepart(year, yt.DateClosed) = DATEPART(year, m.m)
and datepart(month, yt.DateClosed) = DATEPART(month, m.m)
or
datepart(year, yt.DateOpened) = DATEPART(year, m.m)
and datepart(month, yt.DateOpened) = DATEPART(month, m.m)
)
AND year(coalesce(yt.DateClosed, m.m)) = 2010
order by yt.DateClosed
所以上面的查询不会返回所有月份。但是,如果我将 WHERE 行以上更改为:
FROM [PROC].ALL_AUDIT
WHERE
BTK_CLOSED_DATE < @TheMonthLastDate
那么这个查询会返回所有 12 个月。怎么会这样?
当 WHERE 为 BTK_CLOSED_DATE < @TheMonthLastDate 时我想要的输出:
r2 r3 MonthClosed YearClosed
NULL 2010-06-01 00:00:00.000 6 2010
NULL 2009-11-01 00:00:00.000 11 2009
2010-01-06 20:02:19.127 2010-01-01 00:00:00.000 1 2010
2010-01-27 23:13:45.570 2010-01-01 00:00:00.000 1 2010
2010-02-15 14:49:14.427 2010-02-01 00:00:00.000 2 2010
2010-02-15 14:49:14.427 2009-12-01 00:00:00.000 2 2010
但如果我改为使用 WHERE: (BTK_CLOSED_DATE < @TheMonthLastDate OR TSK_START_DATE < @TheMonthLastDate )
然后我看到:
r2 r3 MonthClosed YearClosed
NULL 2010-10-01 00:00:00.000 10 2010
NULL 2010-09-01 00:00:00.000 9 2010
NULL 2010-09-01 00:00:00.000 9 2010
NULL 2010-08-01 00:00:00.000 8 2010
NULL 2010-08-01 00:00:00.000 8 2010
...
所以请注意,在第一个结果中,我看到 2010 年 6 月的 NULL,这正是我想要的。我认为这个问题与我的数据包含 2009-2011 年的数据有关,但我只比较月份而不是年份。我将如何添加这个额外的逻辑?