2012-12-20 70 views
0

我遇到問題了!通過存儲過程更新日期

我的任務是統計圖書館數據庫中書籍的年齡。之後,將一些書籍稱爲太稀有,一些罕見的和通常的使用價值欄。

我的庫表(...,年齡日期,日期值 - )

通知:「年齡」 - 是列的定義不正確,倒不如說「出版年」。其實我的任務是找到年齡!

所以,我這樣做,我的價值列沒有改變:(

create procedure foo 
as 
    declare @bookdate date, 
      @currentdate date, 
      @diff int 

    set @currentdate = GETDATE() 

    select @bookdate = age from books 

    select @diff = DATEDIFF (yyyy , @bookdate , @currentdate) 

版本#1:

UPDATE books SET value = DATEADD(year,@diff, age) 

版本#2:

UPDATE books SET value = @diff 

PS對不起對於我犯的任何錯誤,這是我在sql,編程的第一步,並尋求英語幫助!

+1

*** *** SQL只是*結構化查詢語言* - 許多數據庫系統中使用的語言,而不是AA數據庫產品...很多東西都是特定於供應商的 - 所以我們真的需要知道您使用的數據庫系統**(和哪個版本)...... –

+0

您可以提供樣本數據/預期結果嗎? 我猜你的問題的一部分可能是你正在更新表中的所有行具有相同的值。 – drneel

回答

0

對我來說,這聽起來像你想是這樣的(我假設你使用SQL Server作爲您使用了GETDATE()函數):

CREATE PROCEDURE foo 

AS 
BEGIN 

    SELECT * 
      ,DATEDIFF(yyyy,age,GETDATE()) AS YearsSincePublication 
      ,CASE WHEN DATEDIFF(yyyy,age,GETDATE()) > 200 THEN 'Too rare' 
        WHEN DATEDIFF(yyyy,age,GETDATE()) > 100 THEN 'Rare' 
        ELSE 'Usual' 
      END AS Value 
    FROM books 

END 

工作形成頂部:
*表示所有表中的所有列
datediff正在計算自發布以來的年數,並且AS位爲結果列命名(給它一個別名)。

CASE語句是測試語句的一種方法(如果a等於b,則c)。第一個陳述檢查這本書是否已經超過200年了,如果是的話,寫'太稀有',第二行檢查超過100年,否則寫'平常'。同樣,AS用於將列標記爲Value。

最後,我們希望我們的數據來自表格,書籍。

要運行存儲過程一旦你創建了它很簡單:

EXEC foo 
+0

如果您不使用sql server,您可以隨時將GETDATE()更改爲CURRENT_TIMESTAMP(),但您必須更改case語句以與您的sql供應商匹配。 – twoleggedhorse

+0

是的,我正在使用Sql服務器(2008)。兩個倔強的馬可以完美地理解任務。感謝兩個主人!並感謝大家的幫助!不知道病例陳述。我會研究它。這真的很有幫助。最好的問候,Ievgenii – Ievgenii