【问题标题】:Stored procedure - Date存储过程 - 日期
【发布时间】:2015-07-14 09:29:09
【问题描述】:

正在进行一个需要简单存储过程的大学项目:

创建一个存储过程,该过程采用一个接受日期的参数。日期的数据类型将是日期时间。此存储过程应返回该日期发生的所有房客和房产信息。

它将在大学时在 SQL Server 上提交,但目前我正在家里使用 MS Access 2010 进行培训。

表 = Property_For_Rent:

Pno  \\( this is the property ID )
Address_1
Address_2
Address_3

表 = Renter

Rno \\( this is the renter ID )
Fname
Lname

表 = Viewing

Rno
Pno
Date

研究发现这里的另一个人有类似的难题(更容易调整,如果有人能指出哪里出了问题,那就太好了,谢谢!

create procedure sp_orders_by_dates
    @startdate smalldatetime,
    @enddate smalldatetime
as
    select  
       OrderID,
       o.CustomerID,
       c.CompanyName as CustomerCompany,
       s.ShipperID,
       s.CompanyName as ShipperCompany,
       ShippedDate
    from    
       Orders o 
    join 
       Customers c on o.CustomerID = c.CustomerID 
    join 
       Shippers s on s.ShipperID = o.ShipperID
    where 
       @startdate = ShippedDate,
       @enddate = ShippedDate
    order by 
       ShippedDate

【问题讨论】:

  • 欢迎来到 SO。 +1 实际上承认它是一个大学项目,并展示你到目前为止所拥有的东西。
  • 那么,问题到底是什么?
  • 下载并安装 sql server express edition。不要用access来学习sql server。
  • 旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免 sp_ 并使用其他东西作为前缀 - 或者根本不使用前缀!
  • 所以应该是WHERE ShippedDate = @StartDate OR ShippedDate = @EndDate ....

标签: sql sql-server parameters procedure


【解决方案1】:

由于您使用的是日期时间数据类型,因此您必须考虑一天中的时间。

 where shippedDate >= @dateParameter
 and shippedDate < DateAdd(day, 1, @dateParameter)

在处理同时包含日期和时间的数据类型时,请习惯这种方法。

【讨论】:

    【解决方案2】:

    SQL 实现并不相同。它们并不都使用 exactly 相同的语法,并且它们并不都实现 exactly 相同的东西。例如,MS-Access(据我所知)根本不提供存储过程。 (但它确实知道如何向相应的服务器发出查询和 DML 命令。

    例如,“SQL Server!” :-) Microsoft确实免费提供“SQL Server Express”,(大部分...)SQL Server,专为在一台机器上使用而设计。使用此工具,您应该能够复制您希望在实验室中使用的几乎相同的环境。当然,MS-Access 是一个非常好的工具,可以用来“访问”您所做的工作。

    【讨论】:

    • 虽然如此,但这并不能以任何方式回答问题。另外,在你写这篇文章的 40 分钟前,我已经对这个完全相同的问题发表了评论。
    【解决方案3】:

    我不明白。
    您描述的表在存储过程中甚至都没有提到。
    您希望它如何工作?

    您应该在所有 3 个表上使用 INNER JOIN,并将表 Viewing 上的 Date 列与 WHERE 子句中的 @Date 变量进行比较。
    基本上,它应该是这样的:

    SELECT *
    FROM Table1 T1
    INNER JOIN Table2 T2 ON(T1.JoinColumn = T2.JoinColumn)
    INNER JOIN Table3 T3 ON(T2.OtherJoinColumn = T3.JoinColumn)
    WHERE Table3.ConditionColumn = @Date
    

    现在您所要做的就是弄清楚如何将您的表和列放入该 sql 语句而不是我的模型中。
    祝你好运。

    【讨论】:

    • 我不认为他们编写了他们包含的代码 - 我认为它是从其他人的类似问题中复制而来的,他们要求我们根据他们的情况对其进行修改。
    • @aphrael 也许,但除非这是一个关于如何让其他人做你的家庭作业的项目,否则我的回答将比仅仅给他完整和经过测试的解决方案更有益于 OP。据我所知,编程是用手指学习的。
    • 完全同意。只是评论你答案的第一段。
    • 大家好,谢谢各位同学的帮助!我试过他的方法,最终结果: ALTER PROCEDURE Renter_Property_Info_by_Date @Date datetime SELECT * FROM Renter T1 INNER JOIN Viewing T2 ON(T1.Rno = T2.Rno) INNER JOIN Property_for_Rent T3 ON(T2.Pno = T3.Pno) WHERE Viewing .Pno = 出发日期
    • ,即使没有“Go”,仍然会出现错误:关键字“SELECT”附近的语法不正确。通过查看该代码 Zohar,它仍然没有提供您在上面看到的所需内容,我有 3 个表可以使用 Property_For_Rent:Pno(这是 id),Renter:Rno(租户 id),Fname,Lname 和查看:Pno,Rno,日期,评论。如果您可以帮助使用存储的 DATE 过程将 pno 链接到 rno 和 cmets 的上述代码。非常感谢,我非常感谢它
    猜你喜欢
    • 2015-10-24
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 2017-03-30
    • 2016-10-05
    • 1970-01-01
    相关资源
    最近更新 更多