基于另一列的日期范围更新列的最佳SQL方法。
我的代码如下。由于我是SQL新手,所以我很难找到更简单的方法来根据日期差异更新列。基本上我想做的是,如果日期介于今天和今天之间减去7天(将symbology_bbl列更新为week1)。以下内容已更新基于另一列的日期范围更新列的最佳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;
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'。。。每一次
快速前进
而不是只读前进
,因为默认情况下游标是全局的(在您的用例中是不必要的),所以您至少应该将本地静态
添加到中。但这说明了这是如何阻止它并行的。。。狡猾的微软。。。因此,仅使用本地静态向前
可能会更快。。。对于大多数游标,再次添加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