我有一个名为CalendarInformation的日历表,该表为我提供了2015年至2025年的日期列表。该表有一个名为BusinessDay的列,该列显示什么日期是周末或假日。我还有一个名为OpenProblemtimeDiffTable的表,该表的问题编号为number,问题打开的日期为ProblemNew,当前列的另一个日期为Now。我想要做的是为每个问题编号获取其日期范围,并找到它们之间的日期,然后对其求和以得出工作日数。然后,我想将这些值插入到另一个表中,该表具有与工作日相关的问题编号。
预先感谢,希望我表示清楚。
TRUNCATE TABLE ProblemsMoreThan7BusinessDays
DECLARE @date AS date
DECLARE @businessday AS INT
DECLARE @Startdate as DATE, @EndDate as DATE
DECLARE CONTACT_CURSOR CURSOR FOR
SELECT date, businessday
FROM CalendarInformation
OPEN contact_cursor
FETCH NEXT FROM Contact_cursor INTO @date, @businessday
WHILE (@@FETCH_STATUS=0)
BEGIN
SELECT @enddate= now FROM OpenProblemtimeDiffTable
SELECT @Startdate= problemnew FROM OpenProblemtimeDiffTable
SET @Date=@Startdate
PRINT @enddate
PRINT @startdate
SELECT @businessday= SUM (businessday) FROM CalendarInformation WHERE date > @startdate AND date <= @Enddate
INSERT INTO ProblemsMoreThan7BusinessDays (businessdays, number)
SELECT @businessday, number
FROM OpenProblemtimeDiffTable
FETCH NEXT FROM CONTACT_CURSOR INTO @date, @businessday
END
CLOSE CONTACT_CURSOR
DEALLOCATE CONTACT_CURSOR
我使用游标尝试了此代码,但是我已经关闭了,但是我无法获取每一行要更改的日期范围。
因此,如果我有一个问题编号,其日期范围在02-07-2018和05-20-2019之间,则我希望在新表格中将日历中的工作日总数与问题编号一起。因此,我的输出将是列号PROB0421个工作日(具有正确的总和)。然后是下一个问题PRB0422,日期范围为11-6-18至5-20-19。这样我的输出将是PROB0422,带有正确的工作日总数。
答案 0 :(得分:0)
我认为您可以在没有光标的情况下执行此操作。应该只需要一个insert..select语句。
我假设您的“工作日”列只是位或标志类型的字段,如果日期是工作日,则为1,否则为0?如果是这样,这应该可以工作(如果我不能正确理解您的环境,也可以这样做)。
insert ProblemsMoreThan7BusinessDays
(
businessdays
, number
)
select
number
, sum( businessday ) -- or count(*)
from OpenProblemtimeDiffTable op
inner join CalendarInformation ci on op.problem_new >= ci.[date]
and op.[now] <= ci.[date]
and ci.businessday = 1
group by
problem_number
我通常会尝试避免使用游标并以程序方式使用数据,特别是如果我可以处理上述任务时。不要将数据视为1000个单独的行,而是将数据视为仅两组数据。它们如何联系?
答案 1 :(得分:0)
您应该以基于集合的方式处理此问题,而不是使用cursor
进行此操作。您已经有一个日历表,这使操作变得容易得多。基本方法是从数据表中select
到日历表中join
,以返回日历表中位于日期范围内的所有行。然后,您可以在此处根据需要进行汇总。
尽管与您的情况相符,并根据需要进行调整,但这看起来类似于以下内容:
select p.ProblemNow
,p.Now
,sum(c.BusinessDay) as BusinessDays
from dbo.Problems as p
join dbo.calendar as c
on c.CalendarDate between p.ProblemNow and p.Now
and c.BusinessDay = 1
group by p.ProblemNow
,p.Now