2012-12-20 62 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