使用光标将日期范围添加到表中以获取各个值

时间:2019-05-21 14:49:54

标签: tsql

我有一个名为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,带有正确的工作日总数。

2 个答案:

答案 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