基于另一列的日期范围更新列的最佳SQL方法。

基于另一列的日期范围更新列的最佳SQL方法。,sql,sql-server,Sql,Sql Server,我的代码如下。由于我是SQL新手,所以我很难找到更简单的方法来根据日期差异更新列。基本上我想做的是,如果日期介于今天和今天之间减去7天(将symbology_bbl列更新为week1)。以下内容已更新 USE [databasename] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE or Alter PROCEDURE gisuser.GetTheDate AS BEGIN SET NOCOUNT ON;

我的代码如下。由于我是SQL新手,所以我很难找到更简单的方法来根据日期差异更新列。基本上我想做的是,如果日期介于今天和今天之间减去7天(将symbology_bbl列更新为week1)。以下内容已更新

USE [databasename]
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE or Alter PROCEDURE gisuser.GetTheDate
AS
BEGIN 
SET NOCOUNT ON;  
    Declare @rowcount int
    Declare @editedDate datetime
    Declare @Symbology_BBL nvarchar(25)

    Declare mycursor cursor FORWARD_ONLY READ_ONLY LOCAL FOR 
        select objectID, Edited_Date, Symbology_BBL 
        from [tablename] order by objectid asc
    Open mycursor
    fetch next from mycursor
        into @rowcount, @editedDate, @Symbology_BBL

    while @@FETCH_STATUS = 0
    Begin
    --if edited_date is from 11/21/2018 to 11/28/2018
    begin
    set @Symbology_BBL = 'Week1'
    end
    --elseif edited_date is from 11/15/2018 to 11/20/2018
    begin
    set @Symbology_BBL = 'Week2'
    end
    else 
    begin
    set @Symbology_BBL = 'Greater than Week3'
    end
--*******************************************************************************
        Update [tablename]
        set symbology_bbl = @Symbology_BBL

        fetch next from mycursor
        into @rowcount, @editedDate, @Symbology_BBL
      End
    Close mycursor
    deallocate mycursor
END

提前谢谢你的帮助

update
没有
where
子句,因此它将写入所有行

    Update [tablename]
    set symbology_bbl = @Symbology_BBL

update
没有
where
子句,因此它将写入所有行

    Update [tablename]
    set symbology_bbl = @Symbology_BBL

您的查询运行缓慢,原因如下

游标执行得非常糟糕,这是一种方法学

下面是光标当前正在做的事情,以及它花费很长时间的原因(除了阻止更新、索引、yada-yada所需的锁之外)

从tableName中选择count(符号学)

这里返回了什么号码。。。你的光标是

  • 多次执行/循环此操作
  • 为每一行设置SYMBOLY_BBL='usa'。。。每一次
所以基本上,如果表中有1000行,那么每行更新1000次。而这一点是毫无意义的——你可以用什么样的方式或至少是用什么样的方式来组织你的更新呢。您最可能想要的是一份报告,但您还没有提供足够的资料来确定这一点

此外,您还可以使用
快速前进
而不是
只读前进
,因为默认情况下游标是全局的(在您的用例中是不必要的),所以您至少应该将
本地静态
添加到
中。但这说明了这是如何阻止它并行的。。。狡猾的微软。。。因此,仅使用
本地静态
向前
可能会更快。。。对于大多数游标,再次添加
localstatic

编辑

根据您的评论和编辑,这里是最简单的方法

update tablename
set Symbology_BBL = case 
                    when last_edited_date between GETUTCDATE() -7  and GETUTCDATE()
                    then 'Week 1'
                    when last_edited_date between GETUTCDATE() - 14 and GETUTCDATE() - 8
                    then 'Week 2'
                    else 'Greater Than Week 3'
                    end

您的查询运行缓慢,原因如下

游标执行得非常糟糕,这是一种方法学

下面是光标当前正在做的事情,以及它花费很长时间的原因(除了阻止更新、索引、yada-yada所需的锁之外)

从tableName中选择count(符号学)

这里返回了什么号码。。。你的光标是

  • 多次执行/循环此操作
  • 为每一行设置SYMBOLY_BBL='usa'。。。每一次
所以基本上,如果表中有1000行,那么每行更新1000次。而这一点是毫无意义的——你可以用什么样的方式或至少是用什么样的方式来组织你的更新呢。您最可能想要的是一份报告,但您还没有提供足够的资料来确定这一点

此外,您还可以使用
快速前进
而不是
只读前进
,因为默认情况下游标是全局的(在您的用例中是不必要的),所以您至少应该将
本地静态
添加到
中。但这说明了这是如何阻止它并行的。。。狡猾的微软。。。因此,仅使用
本地静态
向前
可能会更快。。。对于大多数游标,再次添加
localstatic

编辑

根据您的评论和编辑,这里是最简单的方法

update tablename
set Symbology_BBL = case 
                    when last_edited_date between GETUTCDATE() -7  and GETUTCDATE()
                    then 'Week 1'
                    when last_edited_date between GETUTCDATE() - 14 and GETUTCDATE() - 8
                    then 'Week 2'
                    else 'Greater Than Week 3'
                    end


我没有看到你的代码中缺少任何东西。可能这不是一个无限循环,它只是运行的时间比你预期的要长。循环更新是魔鬼的产物。这可以而且应该用一条update语句来完成。当然,您没有where子句,所以这里的每次迭代都会更新整个表。SQL是一种基于集合的语言。您不应该循环每一行进行更新。一定要告诉我你想做什么。我看不到你的代码中缺少任何东西。可能这不是一个无限循环,它只是运行的时间比你预期的要长。循环更新是魔鬼的产物。这可以而且应该用一条update语句来完成。当然,您没有where子句,所以这里的每次迭代都会更新整个表。SQL是一种基于集合的语言。您不应该循环每一行进行更新。一定要告诉我你想做什么。这只是我想看看这个过程是否正常,但是,我需要在代码中做一些if语句。即使只是更新声明,也要花很长时间。就像一个无限循环。这只是我试图看看这个过程是否正常工作的一部分。然而,我需要在代码中执行一些if语句。即使只是更新声明,也要花很长时间。就像一个无限循环。我怎样才能进行连接呢?我只是使用一个表从中获取两列。考虑到您提供给我们的逻辑,@JT4U,语句
UPDATE[Tablename]SET symbology_bbl='usa'
将获得完全相同的最终结果。如果您添加一些示例数据和预期结果,我们可以向您展示。否则这将是一个猜测。我需要这个过程来运行并循环遍历每个记录,以便在其中基本上做到这一点。我已经更新了上述问题中的程序代码。因此,基本上我需要所有符号从“美国”更改为“美国”。这只是一个例子。不像场景那样的实际代码。完成,没有循环。请参见编辑。将来,请确保在开始时添加所有这些内容,这样您就不会遇到XY问题:我将如何进行连接我只使用一个表来获取两列。考虑到您提供给我们的逻辑,@JT4U,语句
UPDATE[Tablename]SET symbology_bbl='usa'
将获得完全相同的最终结果。如果您添加一些示例数据和预期结果,我们可以向您展示。否则它将是一个gu