2011-01-28 11 views
-1

下の行を参照してください。クエリで何が問題になりますか?

FID |  IssueDate     | IssueType   | Status 
46128 |  2010-12-30 00:00:00.000  |  2    |  1 

を私は初心者があまりにも行うことができ、非常に愚かなことでstuckedています。私は上記の行を更新する必要があります。私はすでにさまざまな方法で同じものを求めていますが、まだ達成されていません。どうしてか分かりません????。

は私が

FID

上記の問題の種類はステッカーや状態の私のタイプは、ステッカーの現在の状態であり、発行日が私のステッカー発行日で、私の主キーで説明しましょう。

今、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 

UPDATE:

実際には、いくつかの条件がある **

1. It should occur every year 1st April or onwards. 

     2. All issue dates that are on or before 31st March of that year will get 
expires, status =3 

     3. So i put a check if current date is 1st april or greater than that. 
because there might be a condition if the system was switched off on 1st april 
and started working on 4 th April. So even in this case the stickers prior to 
1st april will have to expire. 

     4. For making my query clear, just take an example of Insurance policy , 
which is only valid for a year. Like if i have registered it on 28th Jan2011, 
then it will automatically get expired on next year 27th Jan 2012 midnight. 
But here in my case date is fixed to 31st March midnight every year. 

     5. Columns names and parameters are not an issue here, i had 
placed somewhat diff here consider FID = FisherId 

     6. Need a query that will automatically populate the @FirstAprilOfEveryYear 
with first april of that year, so that it will be carried out automatically. 

** 
+1

たくないかもしれないものを私は私の心に、現在の年の最初の4月の意味で混乱したタッチだ2011.04.01''(DATEADD選択(月、 datediff(月、0、getdate())、 '18990401')) 'が返す2010.04.01 - これは予想される動作ですか? – Robb

+0

あなたの質問には、間違った列名が含まれています。おそらく 'UPDATE tblStickerInfo SET Status = 3 WHERE FID = 46128とIssueDate <@FirstAprilOfCurrentYear AND St​​atus = 1'であるべきです。 –

+0

これを4日間で実行すると、 '@ FirstAprilOfCurrentYear'変数には昨年の最初の年が含まれます(2010-05-01) –

答えて

4

@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 
+0

更新されたクエリを参照 –

+0

@AmRan:使用できる可能性のあるものを追加しました。 –

3

WHERE FisherId = 46128 AND

あなたはFischeridの値をハードコーディングすることを意味しましたか?代わりに入力変数を使うべきではありませんか?

+1

を参照し、列名は' FID'です。しかし、既に@FisherId'BIGINTパラメータがあります。実際の問題は、 '@ FirstAprilOfCurrentYear'が2010-04-01を返すことです(Mikaelsの答えを参照)。 – Filburt

+0

更新されたクエリを参照 –

関連する問題