Sql server 这个问题怎么了?
请参见下一行:Sql server 这个问题怎么了?,sql-server,Sql Server,请参见下一行: FID | IssueDate | IssueType | Status 46128 | 2010-12-30 00:00:00.000 | 2 | 1 我被一件非常愚蠢的事情绊住了,一个初学者也能做得很好。我需要更新上面的行。我已经以各种方式提出了同样的解决方案,但还没有实现。我不知道为什么 让我来解释一下 FID是我的主键,Issue
FID | IssueDate | IssueType | Status
46128 | 2010-12-30 00:00:00.000 | 2 | 1
我被一件非常愚蠢的事情绊住了,一个初学者也能做得很好。我需要更新上面的行。我已经以各种方式提出了同样的解决方案,但还没有实现。我不知道为什么
让我来解释一下
FID是我的主键,Issue Date是我的贴纸Issue Date,Issue type是我的贴纸类型,status是贴纸的当前状态
现在我要检查的是发行日期与当前年份的4月1日。如果系统日期已从3月31日(固定的最后到期日期)更改,则行的状态将自动变为过期,并且状态将从1更改为3
我正在使用给定的查询,执行后显示0行已更新。请告诉我哪里出错了
ALTER PROCEDURE [dbo].[spMakeStickerVoid]
(
@FisherId BIGINT,
@ManipulatedByUser VARCHAR(50),
@OPParam INT OUTPUT
)
AS
BEGIN
DECLARE @CurrentDate as DATETIME,
@FirstAprilOfCurrentYear AS DATETIME
SET @FirstAprilOfCurrentYear = (select dateadd(month,datediff(month,0,getdate()) ,'18990401'));
SET @CurrentDate = GETDATE();
--SET @OPParam =0
IF @CurrentDate >= @FirstAprilOfCurrentYear
BEGIN
UPDATE tblStickerInfo
SET StatusId = 3
WHERE FisherId = 46128 AND (IssuedDate < @FirstAprilOfCurrentYear) AND StatusId = 1
END
--SET @OPParam =1
END
其中FisherId=46128,且
你是想硬编码Fischerid的值吗?您不应该使用输入变量吗?
@FirstAprilOfCurrentYear
是2010年4月1日,这意味着(IssuedDate<@FirstAprilOfCurrentYear)
不是真的
这可能是你想要的
declare @FirstOfAprilCurrentYear datetime
set @FirstOfAprilCurrentYear = dateadd(year,datediff(year,0,getdate()) ,'1900-04-01')
if @FirstOfAprilCurrentYear >= getdate()
begin
-- Current date is After 31st March current year
update tblstickerinfo
set statusid = 3
where IssuedDate < @FirstOfAprilCurrentYear
end
declare@FirstOfAprilCurrentYear日期时间
set@FirstOfAprilCurrentYear=dateadd(year,datediff(year,0,getdate()),'1900-04-01')
如果@FirstOfAprilCurrentYear>=getdate()
开始
--当前日期在本年3月31日之后
更新tblstickerinfo
设置statusid=3
发布日期<@四月一日
终止
我被今年4月1日的含义弄糊涂了,在我看来这意味着2011.04.01
但是(选择dateadd(month,datediff(month,0,getdate()),'18990401'))
返回2010.04.01-这是预期的行为吗?值得一提的是,您的查询引用了不正确的列名。它可能应该是UPDATE tblStickerInfo SET Status=3,其中FID=46128,IssueDate<@FirstAprilOfCurrentYear AND Status=1
。如果在四天内运行此操作,变量@FirstAprilOfCurrentYear
将包含去年5月1日(2010-05-01)。。。列名为FID
。但是已经有了一个@FisherId
BIGINT参数。真正的问题是@firstAprilofccurrentYear
返回2010-04-01(参见Mikaels的答案)。@AmRan:添加了一些您可能能够使用的内容。
declare @FirstOfAprilCurrentYear datetime
set @FirstOfAprilCurrentYear = dateadd(year,datediff(year,0,getdate()) ,'1900-04-01')
if @FirstOfAprilCurrentYear >= getdate()
begin
-- Current date is After 31st March current year
update tblstickerinfo
set statusid = 3
where IssuedDate < @FirstOfAprilCurrentYear
end